首先,需要说明的是,一个函数名代表的是一个地址,即一个函数的首地址。
知道了这一点便很容易理解函数真正的意义了。
void Fun( int a ); void main() { int (*pFun)(int); //这里定义了一个函数指针pFun pFun = Fun; //这里传值,可以任意形式如 pFun =&Fun,之类的,最后编译器都会认为是一个地址 (*pFun)(2);
} void Fun( int a ) { return; }
接着,我定义出一种函数指针类型,方便我操作,比如我可以这样定义我的类型。
typedef unsigned int UINT;
同样的我的函数指针类型,也可以用typedef的方式定义出来,看起来稍微有点别扭
typedef void (*FunType)(int ); //这样只是定义一个函数指针类型,类型名叫FunType
然后我就可以在代码中生成FunType fun1;
FunType fun1 fun2; void main()
{
fun1 =&Fun; fun2 =Fun;
fun1(20); (*fun)(20); //这里我们就可以看出 Fun 和fun1本事并没有区别,都是值函数指针。 }
最后,用一个回调函数加深 对函数指针的理解。
#include<stdio.h> typedef void (* Fun)(int); // 定义一种函数指针类型 Fun 代表返回值为void 带一个int 参数的函数指针 void callback(int *a, Fun visit) { int i; for (i = 0; i < 6; i++) { visit(a[i]); } printf("\n"); } //回调1 void print_int(int i) { printf("%d ", i); } //回调2 void print_char(int i) { printf("%c ", i); } void main(void) { int a[6]={65,66,67,68,69,70}; callback( a,print_int); callback( a,print_char); }
这里打印的结果:
65 66 67 68 69 70
A B C D E F
至此函数指针这个话题应该就理解了。
原文:http://www.cnblogs.com/crazyyer/p/3658975.html