彻底搞懂函数指针和指针函数回调函数

参考: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个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。

当 函数指针 作为函数的参数,传递给一个被调用函数,被调用函数就可以通过这个指针调用外部的函数,这就形成了回调

一般的程序调用函数作用不是非常明显,可以不使用这种形式

最主要的用途就是当函数不处在同一个文件中,比如动态库,要调用其他程序中的函数就只有采用回调的形式

通过函数指针参数将外部函数地址传入来实现调用

函数的代码做了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级。

 

posted @ 2016-12-09 16:29  mrsandstorm  阅读(4450)  评论(1编辑  收藏  举报