c/c++比较灵活的方法:回调函数和函数指针
当代码量比较小或者需求固定的时候,可以在一个函数里绑定另一个函数,实现函数互调。但当需要经常改变函数或需要实现动态调用时,绑定的参量就不能实现。这时候需要用到函数指针和函数回调
回调函数:回调函数是一个不显式调用的函数,通过将回调函数的地址传给调用者从而实现调用
函数指针:指向函数的指针,可以把函数指针传入另一个函数作为形参,实现回调,首先声明指针
void f();//这是一个函数原型,无输入,输出void型
void (*)()//左边圆括弧中的星号是函数指针声明的关键,另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数,注意还没有创建函数指针
unsigned psize = sizeof (void (*) ()); // 获得函数指针的大小
void (*p) (); //声明指针,p是指向函数的指针,该函数无输入,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,
void func()
{
//do something
}
p = func; //p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。
传递回调函数的地址给调用者:现在可以将p传递给另一个函数(调用者) caller(),它将调用p指向的函数,而此函数名是未知的:
void caller(void (*fnp) ())
{
fnp();
}
void func();
int main()
{
p = func;
caller(p); //传递函数地址到调用者
}
如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。
值的内容是署名匹配的函数名和返回类型。例如:创建指针变量,只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:
int main()
{
void caller(void (*) ()); //函数声明
void func(); //函数声明
void (*p) (); //定义指针变量
p=func; //指针变量赋值
caller(p); //回调
getchar();
}
//回调函数
void caller(void (*fnp) ())
{
printf("调用成功");
fnp();
}
//被调函数
void func()
{
printf("回调成功");
}
这是比较简单的情况,大部分情况被调函数都有形参和返回值,回调函数也有返回值,但分析方法是相同的。
c/c++比较灵活的方法:回调函数和函数指针相关推荐
- Kotlin使用高阶函数实现多方法回调
最近项目中开始使用kotlin,遇到的一个问题就是从多方法回调的问题 常规的java回调如下: public interface OnCallBack<T> {void onSuccess ...
- 【转】回调函数,函数指针与函数对象
原文出处:http://shudingbo.spaces.live.com/blog/cns!C33400475B08F157!423.entry?wa=wsignin1.0&sa=24651 ...
- android 成长日记 8.Fragment学习之方法回调
2019独角兽企业重金招聘Python工程师标准>>> 动态加载为何为重叠?什么时候fragment中的控件直接可以在主函数找到(好像都可以直接找到明天测试一个leftfragmen ...
- 【JavaScript 笔记】— 函数高级(变量作用域、解构赋值、方法、高阶函数、闭包、箭头函数、generator)
JavaScript个人笔记 变量作用域 变量提升 全局对象 windows 命名空间 局部作用域 常量 解构赋值 使用场景 方法 apply 装饰器 高阶函数(Array) map reduce m ...
- 在React的render方法中使用箭头函数
在 React 组件中绑定点击事件通常的做法使用 class 属性. class Foo extends Component {handleClick = () => {console.log( ...
- 解决高德地图在线API不支持对应的方法回调返回结果的问题
前阵子做了个基于高德在线地图分析业务数据的web应用,但是在使用其API的过程中发现一个很不友好的问题,那就是它不支持对应的方法回调返回结果(当时不支持,2014-12-18号发布的1.3.5版本更新 ...
- 回调函数 与 函数闭包
回调函数 1.什么是回调函数? 作为参数的函数就是回调函数! 例如:有两个函数A,B如果函数A作为B的一个参数传入B的话,那么我们就称A是回调函数. //声明一个函数 function fn1(a){ ...
- js中函数,方法,事件对比区分,什么是方法,什么是函数
微信小程序开发交流qq群 581478349 承接微信小程序开发.扫码加微信. 正文: 简单的理解:函数是运行在本地的,方法是公用的. 事件是开关,通过某某事件触发某个函数 通常命名规范 ...
- R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间
R语言sys方法:sys.info函数获取系统和用户信息.sys.localeConv函数获取当前区域中的数字和货币表示的详细信息.sys.setFileTime函数更改文件的时间 目录
最新文章
- bzoj 4237 稻草人
- 使一个div垂直+水平居中的几种方法
- android 屏幕横竖屏切换时生命周期运行详解,创建横屏layout,has no declaration in the base
- 嵌入式开发笔记(二)嵌入式系统启动过程 (S5pv210)
- 使用kafka消息队列中间件实现跨进程,跨服务器的高并发消息通讯
- mysql增量备份脚本
- .Net 4.0 之 Dynamic 动态类型
- 常见的c语言头文件作用,C语言的头文件的作用是什么?
- (day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
- python传大文件如何检查遗漏,如何使用Python获取大文件的实时复制进度?
- 微信朋友圈功能测试用例
- ps cc 生成html,Photoshop自定义工具扩展面板(支持PS CC 2019)
- 类似于android短信校验码的demo
- 淘宝群发软件哪款比较好?
- 【python 笔记/小白快速入门python】python浅谈(一)犹抱琵琶半遮面
- ZXing 生成二维码和条形码
- Java提取URL某个参数的值
- sparql 查询例子
- 首富软件测试工资,测试你成为富豪 测试你天生是什么命
- zx1 android版本,索尼NW-ZX100在国内上市 一台非Android的ZX1你愿意尝试吗?
热门文章
- 【转载】进程间的通信之剪贴板方法实现源码
- uva 10759 Dice Throwing
- 倒排文件索引(Inverted File Index)的建立
- 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)
- HDU - 5335 Walk Out(bfs+路径输出+贪心)
- HDU - 5015 233 Matrix(矩阵快速幂)
- 【数据结构】集合及运算
- POJ3695(矩形切割中等题)
- mediasoup-client 和 libmediasoupclient 指南
- 趣谈设计模式 | 桥接模式(Bridge):将抽象与实现分离