一、函数指针
1. 函数的定义
return_type function_name(parameter list) {
function_body
}
return_type: 返回值,函数一定有返回值,返回值为用return关键字。如果void类型返回值,则直接调用return即可;
function_name: 函数名称
parameter list: 参数列表
function_body: 函数执行范式
 
例如声明add函数
int add(int a, int b) {return a + b;}
定义返回值为int的函数,名称add,参数列表为int类型的a,b,函数执行范式:a + b.
return回a + b的结果
 
2. 函数指针声明
return_type (*function_name) (arg0, arg1, arg2, ...);
function_name: 函数名定义为指针类型,即function_name是一个指向函数的指针。
注意,不能定义为
return_type* function_name (arg0, arg1, arg2, ...);
这是返回值为指针的函数,即返回结果为指针类型的函数。
 
3. 第一个函数指针程序
hello_world.cpp
=========================
  1. #include <cstdio>
  2. void function(const char *text) {
  3. printf("%s", text);
  4. }
  5. int main(void) {
  6. void (*pfun)(const char *) = &function;
  7. (*pfun)("Hello, world.\n");
  8. return 0;
  9. }
运行命令编译 
lucky@lucky-macbook:cplusplus_callback_function$ g++ hello_world.cpp -o hello
lucky@lucky-macbook:cplusplus_callback_function$ ./hello
Hello, world.
二、函数式回调
1. 在c/c++允许函数指针作为函数参数传递
例如: void invoke_function(void (*callback_func)(parameter list));
函数invoke_function的参数是函数指针callback_func,对于不熟悉c的开发者一开始会不习惯void (*callback_func)(parameter list)这种声明变量的方式。这样声明变量相当于
#typedef void (*CALLBACK_FUNCTION)(parameter list)
CALLBACK_FUNCTION callback_func;
2. 简单的回调函数程序
function_callback.cpp
=========================
  1. #include <cstdio>
  2. #include <cstring>
  3. #define TEXT_LEN 128
  4. /**定义函数lucky*/
  5. void lucky(char *outName, size_t len) {
  6. strncpy(outName, "Hi, I'm lucky.\n", len);
  7. }
  8. void jacky(char *outName, size_t len) {
  9. strncpy(outName, "Hi, I'm jacky, Nice to meet you.\n", len);
  10. }
  11. void penny(char *outName, size_t len) {
  12. strncpy(outName, "Just call me penny, I like football.\n", len);
  13. }
  14. void introduce(void (*person)(char *, size_t len)) {
  15. char szText[TEXT_LEN] = {0};
  16. (*person)(szText, TEXT_LEN);
  17. printf("%s", szText);
  18. }
  19. typedef void (*FUNC_NAME)(char *, size_t);
  20. int main(void) {
  21. // 直接调用函数指针,注意使用了取地址符号&
  22. introduce(&lucky);
  23. // 直接定义变量方式使用函数指针
  24. void (*pfun)(char *, size_t) = &jacky;
  25. introduce(pfun);
  26. // 先用typedef定义函数指针类型,再用改类型定义对应的函数指针变量,最后对变量赋值并传参调用
  27. FUNC_NAME pfunc2 = &penny;
  28. introduce(pfunc2);
  29. return 0;
  30. }

编译并输出结果

lucky@lucky-macbook:cplusplus_callback_function$ g++ function_callback.cpp -o funcallback
lucky@lucky-macbook:cplusplus_callback_function$ ./funcallback
Hi, I'm lucky.
Hi, I'm jacky, Nice to meet you.
Just call me penny, I like football.

http://blog.csdn.net/sweettool/article/details/72578801

C/C++回调方式系列之一 函数指针和函数回调模式的更多相关文章

  1. Delphi 函数指针(函数可以当参数)

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  2. c++入门之函数指针和函数对象

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性.函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a, ...

  3. c++学习之初话 函数指针和函数对象 的因缘

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性. 函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a ...

  4. Day8 函数指针做函数参数

    课堂笔记 课程回顾         多态 virtual关键字 纯虚函数 virtual func() = 0;         提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...

  5. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  6. typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

    首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...

  7. [C/C++]如何解读返回函数指针的函数声明

    今天在看<深入理解C++11>的时候,看到一段有意思的代码: int (*(*pf())())() { return nullptr; } 我立刻就懵了——从来没有见过这样的函数声明.那么 ...

  8. c语言的函数指针和函数指针数组的简单demo

    今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. #include <cstdio> #include <Windows. ...

  9. C++学习笔记(八):函数重载、函数指针和函数对象

    函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...

随机推荐

  1. PatentTips - Multi-host SATA Controller

    BACKGROUND The present subject matter relates, in general, to a computing system having multi-host p ...

  2. catalina.out 和 catalina.log 的区别和用途

    catalina.out catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stder ...

  3. jquery-5 jQuery筛选选择器

    jquery-5  jQuery筛选选择器 一.总结 一句话总结:选择器加动态添加方法可以不用想方法名,这个简单方便. 1.筛选选择器有哪三种? 过滤 查找 串联 1.过滤 eq();first(); ...

  4. IE浏览器下css hack

    \9    :所有IE浏览器都支持 _和-  :仅IE6支持 *     :IE6.IE7支持 \0    :IE8.IE9支持 \9\0  :IE8部分支持.IE9支持 \0\9  :IE8.IE9 ...

  5. Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作

    1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JN ...

  6. 监控tcp,占用端口---netstat命令

    netstat命令监控tcp,占用端口等等  netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息,语 法:netstat [ ...

  7. [NPM] Pipe data from one npm script to another

    In an effort to bypass saving temporary build files you can leverage piping and output redirection t ...

  8. CEO 系列之一:如何当好创业公司 CEO?(不要用战术的勤奋掩盖战略的懒惰,在创业过程中,最核心问题,就是能把创业情怀变成具体问题。这个问题越具体越好)

    1. 创业公司要先定一个目标,要善于把目标简化, 分解成一个, 一个更具体,更简单的问题2. 针对简单的问题进行聚焦, 做深做强3. 在做的过程中, 把断地推出自己的产品到市场上去试错, 要用事实来证 ...

  9. while 常见程序逻辑

    1. 查找 List L; Position P = L; while (P && P->Element != Key) { P = P->Next; } return P ...

  10. 百度消息推送SDK探究(并附上最简推送Demo)

    上一篇<百度消息推送REST API探究>中了解了如何使用REST API推送消息,这一篇我们来看一下百度消息推送为我们提供的SDK. 帮助文档:http://developer.baid ...