彻底搞懂函数指针和指针函数回调函数
参考:http://www.cnblogs.com/CBDoctor/archive/2012/10/15/2725219.html
背景:以前看别人的代码,总是会看到函数指针的用法。(当时感觉,好高打上,代码移植性真好!绝必技术大拿呀!)
今天:工作任务很多,但是不想做(嘿嘿,偷懒一会吧,毕竟今天周五,哈哈...),整理一下函数指针的用法吧。
温馨提醒:读者千万不要着急,从头到尾认真的看一遍,保证可以搞懂(针对新手,或者模糊的人,高手可以喷喷)。
1. 首先看看通常调用函数的例子
#include <stdio.h> void MyFun(int x); //此处也可以写成 void MyFun(int); int main(void) { MyFun(10); return 0; } void Myfun(int x) { printf("%d\n",x); }
这个MyFun函数是一个无返回值的函数,他并不完成什么事情。As we all know的用法。
我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道MyFun函数名代表的是一个功能(或是说一段代码)。
直到————>注意到函数指针概念时,不得不在思考:函数名到底又是什么东西?
(不要以为这没有什么意义的事噢!呵呵... 继续看你就知道了。)
2. 函数指针变量的申明
As we all know 数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也可以存储在某个函数指针变量里的。这样我就可以通过这个函数指针变量来调用所指向的函数了。
在C系列语言中,任何一个变量,总是要先申明,之后才能使用。那么函数指针变量也应该要先申明吧?那又是如何来申明的呢?以上面例子为例,我来申明一个可以指向MyFun函数的函数指针变量FunP。下面就是申明FunP变量的方法:
void (*FunP)(int); //也可以写成void (*FunP)(int x);
你看,整个函数指针变量如同函数MyFun的申明处一样,只不过——我们把MyFun改成(*FunP)而已,这样就有了一个能指向MyFun函数的指针FunP了。(当然,这个FunP指针变量也可以指向所有其他具有相同参数及返回值的函数。)
没有代码,都是文字,累死宝宝了...
3. 通过函数指针变量调用函数
有了FunP指针变量后,我们就可以对它赋值指向MyFun,然后通过FunP来调用MyFun函数了。看我如何通过FunP指针变量来调用MyFun函数的:
1 #include <stdio.h> 2 3 int main(void) 4 { 5 6 return; 7 }
回调函数:在一处声明和调用,在其他地方实现的这样一个函数称为回调函数
一般回调函数的用法为:
甲方进行结构体的定义(成员中包括回调函数的指针)
乙方定义结构体变量,并向甲方注册,
甲方收集N个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。
当 函数指针 作为函数的参数,传递给一个被调用函数,被调用函数就可以通过这个指针调用外部的函数,这就形成了回调
一般的程序调用函数作用不是非常明显,可以不使用这种形式
最主要的用途就是当函数不处在同一个文件中,比如动态库,要调用其他程序中的函数就只有采用回调的形式
通过函数指针参数将外部函数地址传入来实现调用
函数的代码做了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级。