当代码量比较小或者需求固定的时候,可以在一个函数里绑定另一个函数,实现函数互调。但当需要经常改变函数或需要实现动态调用时,绑定的参量就不能实现。这时候需要用到函数指针和函数回调

回调函数:回调函数是一个不显式调用的函数,通过将回调函数的地址传给调用者从而实现调用

函数指针:指向函数的指针,可以把函数指针传入另一个函数作为形参,实现回调,首先声明指针

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表达式获得函数指针的大小:

#include <iostream>

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++比较灵活的方法:回调函数和函数指针相关推荐

  1. Kotlin使用高阶函数实现多方法回调

    最近项目中开始使用kotlin,遇到的一个问题就是从多方法回调的问题 常规的java回调如下: public interface OnCallBack<T> {void onSuccess ...

  2. 【转】回调函数,函数指针与函数对象

    原文出处:http://shudingbo.spaces.live.com/blog/cns!C33400475B08F157!423.entry?wa=wsignin1.0&sa=24651 ...

  3. android 成长日记 8.Fragment学习之方法回调

    2019独角兽企业重金招聘Python工程师标准>>> 动态加载为何为重叠?什么时候fragment中的控件直接可以在主函数找到(好像都可以直接找到明天测试一个leftfragmen ...

  4. 【JavaScript 笔记】— 函数高级(变量作用域、解构赋值、方法、高阶函数、闭包、箭头函数、generator)

    JavaScript个人笔记 变量作用域 变量提升 全局对象 windows 命名空间 局部作用域 常量 解构赋值 使用场景 方法 apply 装饰器 高阶函数(Array) map reduce m ...

  5. 在React的render方法中使用箭头函数

    在 React 组件中绑定点击事件通常的做法使用 class 属性. class Foo extends Component {handleClick = () => {console.log( ...

  6. 解决高德地图在线API不支持对应的方法回调返回结果的问题

    前阵子做了个基于高德在线地图分析业务数据的web应用,但是在使用其API的过程中发现一个很不友好的问题,那就是它不支持对应的方法回调返回结果(当时不支持,2014-12-18号发布的1.3.5版本更新 ...

  7. 回调函数 与 函数闭包

    回调函数 1.什么是回调函数? 作为参数的函数就是回调函数! 例如:有两个函数A,B如果函数A作为B的一个参数传入B的话,那么我们就称A是回调函数. //声明一个函数 function fn1(a){ ...

  8. js中函数,方法,事件对比区分,什么是方法,什么是函数

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 简单的理解:函数是运行在本地的,方法是公用的.  事件是开关,通过某某事件触发某个函数 通常命名规范 ...

  9. R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间

    R语言sys方法:sys.info函数获取系统和用户信息.sys.localeConv函数获取当前区域中的数字和货币表示的详细信息.sys.setFileTime函数更改文件的时间 目录

最新文章

  1. bzoj 4237 稻草人
  2. 使一个div垂直+水平居中的几种方法
  3. android 屏幕横竖屏切换时生命周期运行详解,创建横屏layout,has no declaration in the base
  4. 嵌入式开发笔记(二)嵌入式系统启动过程 (S5pv210)
  5. 使用kafka消息队列中间件实现跨进程,跨服务器的高并发消息通讯
  6. mysql增量备份脚本
  7. .Net 4.0 之 Dynamic 动态类型
  8. 常见的c语言头文件作用,C语言的头文件的作用是什么?
  9. (day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
  10. python传大文件如何检查遗漏,如何使用Python获取大文件的实时复制进度?
  11. 微信朋友圈功能测试用例
  12. ps cc 生成html,Photoshop自定义工具扩展面板(支持PS CC 2019)
  13. 类似于android短信校验码的demo
  14. 淘宝群发软件哪款比较好?
  15. 【python 笔记/小白快速入门python】python浅谈(一)犹抱琵琶半遮面
  16. ZXing 生成二维码和条形码
  17. Java提取URL某个参数的值
  18. sparql 查询例子
  19. 首富软件测试工资,测试你成为富豪 测试你天生是什么命
  20. zx1 android版本,索尼NW-ZX100在国内上市 一台非Android的ZX1你愿意尝试吗?

热门文章

  1. 【转载】进程间的通信之剪贴板方法实现源码
  2. uva 10759 Dice Throwing
  3. 倒排文件索引(Inverted File Index)的建立
  4. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)
  5. HDU - 5335 Walk Out(bfs+路径输出+贪心)
  6. HDU - 5015 233 Matrix(矩阵快速幂)
  7. 【数据结构】集合及运算
  8. POJ3695(矩形切割中等题)
  9. mediasoup-client 和 libmediasoupclient 指南
  10. 趣谈设计模式 | 桥接模式(Bridge):将抽象与实现分离