一、背景

首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义。

typedef void (PUBLIC *tCdrvCallbackFkt) (tCDrv_Handle CdrvHandle_p,
tCDrv_Event Event_p,
LPARAM pArg_p,
DWORD dwParam_p);

最近在跟别人的代码,要更改别人的代码,所以必须是理解每一行代码的意义和如何使用,遇到关于函数指针的使用,还有回调函数的使用。通过查资料来理解下定义的这个函数指针。

二、函数指针的使用

先不去看上面定义的这个函数指针,从最基本的模型理解起:

int (*p)();

上面定义p为一个指向函数的指针变量,函数返回值为整形。定义时要注意最后的空括号表示指针变量所指的是一个函数。

下面例子说明下,通过代码的注释进行理解。

#include"stdio.h"

typedef void(*p)(char* s);    //定义了一个函数指针类型

void str(char* s);

int main()
{
p test; //定义一个函数指针test
test=str; //将str函数的入口地址赋给test,即指针取地址
test("Hello World\n"); //函数指针test调用str函数,即函数指针取str函数里边的内容
return 0;
} void str(char* s)
{
printf("%s",s);
}

再来看typedef void (PUBLIC *tCdrvCallbackFkt) ()其实就是自命名定义了一个函数指针的类型,这样方便对其它函数指针的定义。

三、回调函数的使用

有了函数指针的基础后,看下如何使用回调函数,回调函数,就是使用者自己定义一个函数,使用者只管实现自己程序的内容而不用去管怎样被调用,然后把这个函数作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。下面例子说明,看代码注释理解:

#include"stdio.h"

typedef void(*p)(char* s);       //定义了一个函数指针类型

void str(char* s);               //函数声明

void Mycallback(p test,char* s)  //实现回调函数调用的函数,对于p test也可以写成 void(*test)(),此函数只管去实现调用,程序里边具体怎样实现不用管
{
test(s);
} int main()
{ Mycallback(str,"Hello"); //回调函数在主程序中实现调用,对于调用回调函数人来说只需要去理解调用的函数传入那些参数就好,不管函数里边内容的具体实现
return 0;
} void str(char* s) //自己定义的回调函数,对于回调函数来说只管去实现程序内容
{
printf("%s",s);
}

四、参考文档

http://qiaopeng688.blog.51cto.com/3572484/1727246

http://www.cnblogs.com/ioleon13/archive/2010/03/02/1676621.html

http://blog.chinaunix.net/uid-8318378-id-2032233.html

by 羊羊得亿

2017-05-19 ShenZhen

最新文章

  1. CentOS7上安装QGIS
  2. 别人整理的DP大全(转)
  3. Device ehth0 is not present
  4. “”?: H3C SSH 配置+
  5. [vim] vim入门
  6. Linux内核基础--事件通知链(notifier chain)
  7. CodeForces 707B Bakery (水题,暴力,贪心)
  8. POJ 2318 TOYS && POJ 2398 Toy Storage(几何)
  9. mysql关联更新
  10. Quartz.net 定时任务之简单任务
  11. python开发:初识python
  12. 安卓7.1 新特性Shortcut
  13. Android之Fragment详解
  14. 七月在线爬虫班学习笔记(五)——scrapy spider的几种爬取方式
  15. 常用的CMD & Linux命令
  16. python版本的简单贪吃蛇
  17. Es6数值拓展
  18. C#设置WebBrowser IE浏览器版本
  19. iOS 11开发教程(十七)iOS11应用视图之使用按钮接收用户输入
  20. XDU 1130 (快速幂)

热门文章

  1. Ubuntu14环境下minigui安装问题记录--object.lo错误
  2. Linux 内核源码(kernel source)
  3. Ubuntu 安装软件和centos 对比命令
  4. centos7 双网卡设置(先NAT和后桥接)
  5. OPENCV(1)
  6. 开发板ping得通本地,但是不能上网
  7. python数据处理技巧二
  8. Windows系统的关机、休眠和睡眠状态究的区别
  9. ajax和axios请求本地json数据对比
  10. 03012_预处理对象executeQuery方法(实现数据库的查询)