当前位置: 首页 > 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.dtcms.com/a/291992.html

相关文章:

  • SpringCloud Nacos配置中心
  • CentOS 8文件描述符耗尽检测与处理实战指南
  • Linux CentOS 虚拟机升级内核至4.x以上版本
  • 为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?
  • AI-调查研究-35-咖啡价格战 味觉与消费体验差异:自制咖啡为何更“好喝”?
  • 【Practical Business English Oral Scene Interpretation】 No9~10
  • vue 用hbuilder打包apk后返回键不好使
  • importlib.import_module() 的用法与实战案例
  • 重构创作边界:川翔云电脑 - UE5云端超算引擎​
  • B端UI组件库重构:如何让开发效率提升40%的交互逻辑拆解
  • 拥抱区块链红利:机遇无限,风险暗涌
  • Python 绘制各类折线图全指南:从基础到进阶
  • MATLAB软件使用频繁,企业如何做到“少买多用”?
  • 互联网隐私的未来:Web3、区块链与神秘法宝
  • Function Modifier
  • 动漫短剧系统开发:构建下一代沉浸式娱乐平台的架构设计与技术突破
  • 使用qt编写上位机程序,出现串口死掉无法接受数据的bug
  • Kotlin 中的单例模式(Singleton)与对象声明
  • 力扣-链表相关题 持续更新中。。。。。。
  • 手写 防抖函数、节流函数
  • 【企业APP上架小米应用商店需要做的准备】(本示例为uniapp开发)
  • LLM评测框架Ragas:SQL指标(解决了Ollama推理框架不支持的问题)
  • oracle查询数据结构滤涉及的sql语句
  • 程序是如何生成的-以c语言为例
  • 行内元素垂直边距为何失效?
  • Vite:下一代前端构建工具的革命
  • 金仓数据库风云
  • 基于JAVA实现基于“obj--html--pdf” 的PDF格式文本生成
  • C语言第二章分支与循环(下)——猜数字游戏
  • 【深度解析】从AWS re_Invent 2025看云原生技术发展趋势