定义
函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整形变量(int),字符型(char),数组([])一样,这里指向函数。C在编译时,每个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可饮用其他类型变量一样,在这些概念上是大体一致的。
函数指针有2个用途:调用函数 和 做函数的参数。
声明方法
函数指针的声明方法为:
返回值类型(*指针变量名)([形参列表]);
注:指针变量名中的括号不能省!因为括号改变了运算符的优先级。若省略了,就变成一个函数说明了。
int func(int x);//这里声明了一个函数
int (*f)(int x);//这里才是声明了一个函数指针,参数为int,返回值类型也是int
f = func;//将func函数的首地址赋给指针f
f = &func;//跟上面的效果一样
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,隐刺经过赋值以后,指针f就指向函数func(x)的代码首地址。
Example
//typedef int(*ptr)(int,int);
int (*ptr)(int,int);
int a,b,c;
ptr = max;
scanf("%d%d",&a,&b);
//c = (*ptr)(a,b);
c = ptr(a,b);
printf("a = %d,b = %d,max = %d",a,b,c);
注释部分都一样
其中
max = 0x011a11f0 max(int,int)
ptr = 0x011a11f0 max(int,int)
*ptr
= 0x011a11f0 max(int,int)
一样!!
cocos2dx里的函数指针
typedef CCLayer* (*NEWTESTFUNC)();
#define CF(className) create##className
static NEWTESTFUNC createFunctions[] = {CF(ActionManual)};
分析:
以上,数组createFunctions里存的是一系列的函数而已,或者说函数指针,没带参数
CF(ActionManual) 的类型就是NEWTESTFUNC,一个返回类型为CCLayer*,参数为空的函数指针——NEWTESTFUNC