当前位置: 首页 > news >正文

【时时三省】(C语言基础)怎样定义和使用指向函数的指针变量

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

怎样定义和使用指向函数的指针变量

定义指向函数的指针变量的一般形式为

类型名( *指针变量名) (函数参数表列);

如“int ( *p ) ( int,int );”,这里的“类型名”是指函数返回值的类型。

怎样判定指针变量是指向函数的指针变量呢?首先看变量名的前面有无“*”号,如*p。如果有,肯定是指针变量而不是普通变量。其次,看变量名的后面有无圆括号,内有形参的类型。如果有,就是指向函数的指针变量,这对圆括号是函数的特征。要注意的是:由于优先级的关系,“*指针变量名”要用圆括号括起来。

说明:

( 1 )定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指说明:向在定义时指定的类型的函数。如“int ( * p ) ( int , int );”表示指针变量ρ可以指向函数返回值为整型且有两个整型参数的函数。在程序中把哪一个函数(该函数的值是整型的且有两个整型参数)的地址赋给它,它就指向哪一个函数。在一个程序中,一个指针变量可以先后指向同类型的不同函数。

( 2 )如果要用指针调用函数,必须先使指针变量指向该函数。如:

P = max ;

这就把max函数的入口地址赋给了指针变量p。

( 3 )在给函数指针变量赋值时,只须给出函数名而不必给出参数,例如:

p = max;

因为是将函数入口地址赋给p,而不牵涉实参与形参的结合问题。

如果写成

p = max ( a , b );

就错了。

p = max ( a , b )的作用是将调用max函数所得到的函数值赋给p ,而不是将函数入口地址赋给p。

( 4 )用函数指针变量调用函数时,只须将( xp )代替函数名即可( p为指针变量名),在( * p )之后的括号中根据需要写上实参。例如:

c = ( * p ) ( a , b );

表示“调用由p指向的函数,实参为a,b。得到的函数值赋给c”。

请注意函数返回值的类型。从指针变量ρ的定义中可以知道,函数的返回值应是整型的。因此将其值赋给整型变量c是合法的。

( 5 )对指向函数的指针变量不能进行算术运算,如p + n,p + +,p--等运算是无意义的。

( 6 )用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数。见下面例题。

例题:

输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数,选2时调用min函数,输出二者中的小数。

解题思路:

这是简单例子,说明怎样使用指向函数的指针变量。定义两个函数max和min,分别用来求大数和小数。在主函数中根据用户输入的数字是1或2,使指针变量指向max函数或min函数。

编写程序:

 运行结果:

程序分析: 

在程序中,调用函数的语句是“c = ( * p ) ( a,b );”。从这个语句本身看不出是调用哪一个函数,在程序执行过程中由用户进行选择,输入一个数字,程序根据输入的数字决定指针变量p指向哪一个函数,然后调用相应的函数。

这个例子是比较简单的,只是示意性的,但它很有实用价值。在许多应用程序中常用菜单提示输入一个数字,然后根据输入的不同值调用不同的函数,实现不同的功能,就可以用此方法。当然,也可以不用指针变量,而用if语句或switch语句进行判断,调用不同的函数。但是显然用指针变量使程序更简洁和专业。

 

http://www.lryc.cn/news/598960.html

相关文章:

  • 北京-4年功能测试2年空窗-报培训班学测开-第五十九天-模拟面试前
  • io_uring:Linux异步I/O的革命性突破
  • Web前端开发:JavaScript reduce() 方法
  • 亚马逊云科技:以云为翼,助你翱翔数字新天空
  • 【高等数学】第五章 定积分——第三节 定积分的换元法和分部积分法
  • Zookeeper的分布式事务与原子性:深入解析与实践指南
  • 暑假集训篇之并发处理①练习题
  • C语言转义字符‘\\‘‘ 解析与常见误区
  • SAP全自动化工具开发:Excel自动上传与邮件通知系统
  • Python字典get方法使用解析
  • Spring之SSM整合流程详解(Spring+SpringMVC+MyBatis)
  • Windows上用于跨平台开发的环境工具
  • 数据集成难在哪?制造企业该怎么做?
  • 神经网络实战案例:用户情感分析模型
  • DPO:大语言模型偏好学习的高效方案
  • 平时遇到的错误码及场景?404?400?502?都是什么场景下什么含义,该怎么做 ?
  • 前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)
  • Linux 磁盘挂载,查看uuid
  • OpenCV图像插值、边缘填充、图像掩膜、噪声消除实战指南
  • Effective Python 第16条:用get处理字典缺失键,避免in与KeyError的陷阱
  • 100条SQL语句分类精讲:从基础到进阶的实操指南
  • OpenGL绘制正方形、错误处理、统一变量、索引缓冲区
  • tcp基础协议
  • node.js中的path模块
  • MySQL深度理解-MySQL索引优化
  • AI服务器给一体成型电感带来多大的市场空间
  • Java学习日记_廖万忠
  • 深度解析:在Odoo 18中基于原生Owl框架为PWA定制功能丰富的底部导航栏
  • 面经 - 车载多媒体系统
  • Vue2——5