函数指针浅谈
11 14, 2008 Linux
函数存放在内存的代码区域内,它们同样有地址。如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。
定义一个指向函数的指针用如下的形式,以上面的test()为例: int (*fp)(int a);//这里就定义了一个指向函数的指针
函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。int *fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注意!
#include <stdio.h>
#include <stdlib.h>
typedef int (*FUNCTION)(int);
int f1(int k)
{
return k;
}
int f2(int j)
{
return j;
}
int f3(int i)
{
return i;
}
int (*foo1(void))[]
{
static int sdata[] = {1, 2, 3};
return sdata;
}
FUNCTION (*foo2(void))[]
{
static FUNCTION sfunc[] = {f1, f2, f3};
return sfunc;
}
int main(void)
{
FUNCTION *pfunc = foo2();
int *p = foo1();
int i = 0;
for ( ; i < 3; ++i)
printf(”%d\n”, p[i]);
for (i=0; i<3; ++i)
printf(”%d\n”, pfunc[i](100));
return 0;
}
利用typedef定义可以简化函数指针的定义,上述示例中typedef int (*FUNCTION)(int);,如果不用这个定义,则需要这样写:int (*((*foo3(void))(int)))[],这样看起来比较吃力。
指针数组元素所保存的只是一个内存地址,既然只是个内存地址就不可能进行a[0]()这样地址带括号的操作,而函数指针不同它是一个例外,函数指针只所以这么叫它就是因为它是指向函数指向内存的代码区的指针,它被系统授予允许与()括号操作的权利,进行间接的函数调用,既然函数指针允许这么操作,那么被定义成函数指针的数组就一定是可以一样的操作的。



来说两句吧