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

void (*f(int, void (*)(int)))(int) 函数解析

 

函数指针

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

今天与几个同学看到了一个函数指针定义:

 

void (*f(int, void (*)(int)))(int)

 

曾经在C trap pit fails里面见过,可是文章里面介绍的非常具体,可是往往使刚開始学习的人抓不到重点, 结果弄的一头污水。这里就简介一下这中函数指针的定义方法。

 

什么是函数指针?

 

这个问题从定义的角度来看非常好理解,指向函数的指针就是函数指针,可是我们怎样声明一个函数指针呢?又怎样将一个地址强制转换为某一个类型的函数指针呢?这里看以下一个样例源代码:

void function(int a)

{

       a = 5;

}

void (*pfunc)(int);

 

非常easy,上面这段代码声明了一个函数fucntion和一个函数指针pfunc, 它指向的函数就是一个具有void返回值,int參数的函数。假设将function函数的地址给pfunc指针,能够简单的通过以下两种赋值:

       pfunc = function;

或者

       pfunc = &function

通过指针调用该函数,也有两种方法:

       pfunc(5); (*pfunc)(5);

我们看一下赋值语句,pfunc = function; 但有时候可能是一个常数0x8999940, 它恰好也表示一个安全的与function同样的函数,怎样将这个数值赋给pfunc呢?显然我们须要强制类型转换,应该将该常数转换成什么类型呢?这就是问题的关键!

       void (*pfunc)(int)语句里面,仅仅有pfunc是变量名称,那么剩余的部分,void(*)(int),就是我们须要的转换类型。因此,新的赋值语句是:

                     pfunc = (void (*)(int)) 0x8999940;

       赋值完毕后,就能够通过pfunc(5); (*pfunc)(5);调用对应的函数了。

 

       假设理解了上面的内容,我们就能够解释void (*signal(int, void (*)(int)))(int)这个相对复杂的问题了

 

返回函数指针的函数声名

 

如今我们先抛开上面那个复杂的定义,先看一下以下的需求1) 定义一个函数;2) 该函数具有以下特点,两个參数,返回值是函数指针,而且一个參数也是函数指针。假如返回值和參数函数指针同为void (*)(int); 还有一个函数參数是int型。该函数定义名称为my_func

 

依据需求我们能够非常easy定义出这样的函数:

 

typedef void (*HANDLER)(int); // 參数函数和返回函数定义

HANDLER my_func(int, HANDLER);

 

突然需求中又不让使用typedef,这就是早期C语言不支持typedef的情况,那么怎样定义这样的函数呢?

我们假如说my_func的返回值是int,是不是它的定义能够这么写:

int my_func(int, void (*)(int));

       也就是说,my_func(int, void (*)(int))就是一个int型数据。如今将int换成一个函数,也就是

              void (*)(int) my_func)(int, void (*)(int);

       这样一种定义,显然这样的语法不支持,那么,实际是怎样表示呢?回过头来,我们先看看函数指针的声明格式

       void (*pfunc)(int)

       当中pfunc 等价于 void (*)(int)。如今在看看上面的格式,是不是非常相识,对了,pfunc就是my_func(int, void (*)(int))如今假设将两者取代一下是不是就成了这样的格式:

              void (*my_func(int, void(*)(int)))(int)

假设将my_func换成signal,是不是就是我们文章開始提到的那个复杂声名?如今是不是明确了,原来如此啊,它是一个返回函数指针的的函数声名!

转载于:https://www.cnblogs.com/zfyouxi/p/4484441.html

相关文章:

  • 我爱淘冲刺阶段站立会议每天任务4
  • jetty运行maven程序(修改及时生效,不需要重启jetty程序)
  • 转:python的命令行输入参数
  • 微一微博的应用项目源码
  • DOM操作
  • Python:利用内建函数将字符串转化为整数
  • NSMutableAttributedString iOS 在UILabel显示不同的字体和颜色(转)
  • 详解如何正确的搭建Linux的服务器集群
  • Java知识点陈列
  • sql server 复制表从一个数据库到另一个数据库
  • Java设计模式-工厂方法模式(Factory Method)
  • 【Win10】开发中的新特性及原有的变更
  • 2014年最新的辛星html、css教程打包公布了,免积分,纯PDF(还有PHP奥)
  • 代码添加控件-从数据库提取数据
  • ARM中的中断
  • 自己简单写的 事件订阅机制
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • create-react-app做的留言板
  • git 常用命令
  • HTML中设置input等文本框为不可操作
  • js递归,无限分级树形折叠菜单
  • JS数组方法汇总
  • laravel with 查询列表限制条数
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Rancher如何对接Ceph-RBD块存储
  • React Transition Group -- Transition 组件
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • v-if和v-for连用出现的问题
  • Vue小说阅读器(仿追书神器)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 聊聊redis的数据结构的应用
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我看到的前端
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 正则与JS中的正则
  • 7行Python代码的人脸识别
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​用户画像从0到100的构建思路
  • # Maven错误Error executing Maven
  • # 数据结构
  • #QT项目实战(天气预报)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2.2w字)前端单元测试之Jest详解篇
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C#)获取字符编码的类
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (十八)三元表达式和列表解析
  • (转)程序员疫苗:代码注入
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET Core 和 .NET Framework 中的 MEF2