一、函数指针
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. [GraphQL] Deploy a GraphQL dev playground with graphql-up

    In this lesson we'll use a simple GraphQL IDL schema to deploy and explore a fully functional GraphQ ...

  2. js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g)

    js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g) 一.总结 方括号:范围 圆括号:选 大括号:数量 1.js正则是在双正斜杠之中: var reg2=/[a-z]/ ...

  3. try~Catch语句中异常的处理过程

    [2014/10/12 21:40]文章待续~ 1.函数自身捕获处理异常的情况 以下的样例介绍了try~catch语句中出现异常时语句的运行顺序: package month10; import ja ...

  4. Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...

  5. Android Error:(1,N1) 错误: 需要class, interface或enum

    造成这个error的原因是Java文件编码格式不对, 比如可能是你之前这个文件是用GBK写的,后来复制到utf-8环境里编译,而文件里有些是隐藏的字符,很难找出来的. 解决方法是在Notepad++新 ...

  6. MD5工具类--可以直接拿来用不抛异常的MD5Util

    public class MD5Util { private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb ...

  7. 【codeforces 604D】Moodular Arithmetic

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. 代码包结构分析工具JDepend的使用方法

    JDepend可以对Java软件包结构质量进行分析,已经有很多文章介绍其基本作用和能够计算的指标了,这里我就不详细总结,感兴趣的朋友可以参看如:http://blog.csdn.net/hantian ...

  9. 极光推送Jpush功能(具体参照官网说明文档,注意此文红色字体)

    1.导入框架 2. //推送 #import "APService.h" - (BOOL)application:(UIApplication *)application didF ...

  10. 阿里云centos7.2自己安装mysql5.7远程不能访问解决方案

    版权声明:转载也行 https://blog.csdn.net/u010955892/article/details/72774920 最近,无意中看到阿里云服务器降价,所以一时手痒,买了一年的服务器 ...