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

【时时三省】(C语言基础)指向函数的指针

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

什么是函数的指针

如果在程序中定义了一个函数,在编译时会把函数的源代码转换为可执行代码并分配一段存储空间。这段内存空间有一个起始地址,也称为函数的入口地址。每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。

调用函数时,从函数名得到函数的起始地址,并执行函数代码。函数名就是函数的指针,它代表函数的起始地址。可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:

int ( *p ) ( int , int );

定义p是一个指向函数的指针变量,它可以指向函数类型为整型且有两个整型参数的函数。此时,指针变量p的类型用

int ( * ) ( int,int )表示。

用函数指针变量调用函数

如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量用函数指针变量调用函数来调用该函数。先通过一个简单的例子来回顾一下函数的调用情况。

例题1:

用函数求整数a和b中的大者。

解题思路:

定义一个函数max,实现求两个整数中的大者。在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。分别编程并作比较。

(1)通过函数名调用函数

运行结果: 

(2)通过指针变量调用它所指向的函数

将程序改写为

 

 运行结果同程序(1)

程序分析:

可以看到,程序( 1 )和( 2 )的max函数是相同的。不同的只是在main函数中调用max函数的方法。

程序( 2 )的第4行“int ( * p ) ( int,int );”用来定义p是一个指向函数的指针变量,最前面的int表示这个函数值(即函数返回的值)是整型的。最后面的括号中有两个int,表示这个函数有两个int型参数。注意*p两侧的括号不可省略,表示p先与*结合,是指针变量,然后再与后面的( )结合,( )表示是函数,即该指针变量不是指向一般的变量,而是指向函数。如果写成“int * p ( int,int );”,由于( )优先级高于*,它相当于“int * ( p ( int,int ) )”,就成了声明一个p函数了(这个函数的返回值是指向整型变量的指针)。

赋值语句“p = max”的作用是将函数max的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址,这样,p就是指向函数max的指针变量,此时p和max都指向函数的开头。调用* p就是调用max函数。请注意p是指向函数的指针变量,它只能指向函数的入口处而不可能指向函数中间的某一条指令处,因此不能用* ( p +1 )来表示函数的下一条指令。

在main函数中有一个赋值语句:

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

它和

c = max ( a,b );

等价。这就是用指针实现函数的调用。以上用两种方法实现函数的调用,结果是一样的。

 

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

相关文章:

  • 发票识别在费控系统应用剖析
  • Dify-13: 文本生成API端点
  • uniapp打开导航软件并定位到目标位置的实现
  • 从零搭建 OpenCV 项目(新手向)--第一天初识OpenCV与图像基础
  • 京东视觉算法面试30问全景精解
  • Thinkphp8使用Jwt生成与验证Token
  • 最新基于R语言结构方程模型分析与实践技术应用
  • 《C++》面向对象编程--类(中)
  • 八大作业票(一) 动火安全作业证
  • Spring Boot环境搭建与核心原理深度解析
  • 豪鹏科技锚定 “AI + 固态” 赛道:从电池制造商到核心能源方案引领者的战略跃迁
  • 大数学习笔记整理
  • iOS WebView 调试实战 localStorage 与 sessionStorage 同步问题全流程排查
  • Java(LinkedList和ArrayList底层分析)
  • Docker Compose UI远程访问教程:结合贝锐花生壳实现内网穿透
  • 应用层攻防启示录:HTTP/HTTPS攻击的精准拦截之道
  • 渗透部分总结
  • 大模型——Data Agent:超越 BI 与 AI 的边界
  • L0 范数、L1 范数和 L2 范数详解(归一化+正则化)
  • 【CAN】2.帧格式
  • 【数据结构初阶】--栈和队列(一)
  • 洛谷 B3939:[GESP样题 四级] 绝对素数 ← 素数判定+逆序整数
  • 二、PV输入升压电路
  • opencv-图像处理
  • Typecho三种版权保护方法对比与实战指南
  • ArKTS: DAL,Model,BLL,Interface,Factory using SQLite
  • 欧式装修颜色要怎么搭配?
  • 前端学习日记(十)
  • 【专题十三】队列 +宽搜
  • 3.5 模块化编程实践