一、函数指针
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. chain rule 到 Markov chain

    1. 联合概率(joint distribution)的链式法则 基于链式法则的 explicit formula: p(x1:n)===p(x)p(x1)∏i=2np(xi|x1,-,xi−1)∏i ...

  2. ViewChild与ContentChild的联系和区别

    原文 https://www.jianshu.com/p/5ab619e576ea 大纲 1.认识ViewChild 2.认识ContentChild 3.ViewChild与ContentChild ...

  3. 向 Windows 高级用户进阶,这 10 款效率工具帮你开路 | 新手问号

    原文地址:https://sspai.com/post/41411 编注:「新手问号」是少数派的一个全新栏目.它面向完全「零基础」的新手用户,通过最简单易懂的方式,帮助你快速掌握关于系统和软硬件的入门 ...

  4. [TypeScript] Understand lookup types in TypeScript

    Lookup types, introduced in TypeScript 2.1, allow us to dynamically create types based on the proper ...

  5. ArcGIS二次开发入门(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 公司培训ArcGIS二次开发(C#作为开发语言),自己回家动手实践了一下. 1. 首先是二次开发环境的安装(AE 10 ...

  6. 文件流结尾的EOF详解

    我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...

  7. PHP正则表达式怎么匹配多行

    PHP正则表达式怎么匹配多行 一.总结 1.可以用匹配模式修饰符s来使点匹配所有字符,包括换行符. 二.PHP匹配多行的正则表达式分析 代码如下: <table> <tr>&l ...

  8. [.NET Core 24]把project.json迁移到.csproj

    链接:https://blog.jetbrains.com/dotnet/2017/04/04/rider-eap-update-csproj-based-net-core-support-migra ...

  9. BZOJ 1864 三色二叉树 - 树型dp

    传送门 题目大意: 给一颗二叉树染色红绿蓝,父亲和儿子颜色必须不同,两个儿子颜色必须不同,问最多和最少能染多少个绿色的. 题目分析: 裸的树型dp:\(dp[u][col][type]\)表示u节点染 ...

  10. 【codeforces 776D】The Door Problem

    [题目链接]:http://codeforces.com/contest/776/problem/D [题意] 每个门严格由两个开关控制; 按一下开关,这个开关所控制的门都会改变状态; 问你能不能使所 ...