定义函数指针
定义函数指针时需要指定它指向的函数类型.函数的类型由它返回类型和参数表决定,函数名不是函数类型的一部分,函数返回类型和参数表组合在一起代表了不同的函数类型.下面的语句申明了一个指向函数的指针,该函数有两个int参数,并返回int类型的值:
Int (*pf) (int,int)//pf是一个函数指针
Int f(int,int)//pf可以指向f
Int q(int);//pf不能指向函数g
可以用typedef 定义函数指针类型:
Typedef int (*PFT)(int,int);//PFT可以作为类型来定义函数指针
PFT pf;//pf是一个函数指针
//函数到指针的转换
Int f(int);
Typedef int (*PF)(int);
Void g(int,PF);
….
G(10,f);//精确匹配;从函数到指针的转换
函数指针的调用
对于复杂的函数指针定义或者声明,可以从中间往外读
//fp1是一个指向函数的指针,该函数带一个int参数,并且返回一个指向有10个void指针元素的数组指针
Void*(*(*fp1)(int))[10];
//fp2是一个指向函数的指针,该函数带有三个参数为int,int,bool,并且返回一个指向函数的指针,这个函数带int参数,并返回float
float(*(*fp2)(int,int,bool))(int);
//fp3是一个指向函数的指针,该函数参数为一个int,返回一个指向有10个指向函数指针数组的指针,这些函数带有一个bool参数并且返回double值
Double (*(*(*fp3)(int))[10])(bool);
函数指针的定义理解比较绕,个人总结的一个比较笨的方法,不对的地方请指正.
Double (*(*(*fp3)(int))[10])(bool); //fp3是一个指向函数的指针,该函数参数为一个int,返回一个指向有10个指向函数指针数组的指针,这些函数带有一个bool参数并且返回double值
可以如下理解:
从(*fp3)知道这个是一个函数指针,那fp3中存的是待调用的函数的地址,那还从这句开始
(*fp3)取出待执行函数地址,这里的”*” 理解可同下
int a = 90;
int* p = &a;
*p = 100;//上面的*,可以理解为这一行的”*”
(*fp3)(int)只有地址没有参数怎么执行呢?再导入一个int类型参数
(*(*fp3)(int))这一行的第一个*可以看成是获得(*fp3)(int)执行结果,第一个*的含义同第2点中的”*”
(*(*fp3)(int))[10]原来返回结果是一个数组
(*(*(*fp3)(int))[10])不知道数组里面存的是什么?那取一个出来看看先,也就是再套个”*”并括起来
(*(*(*fp3)(int))[10])(bool);返回数组里面居然是函数,并且函数的参数是bool型的
Double (*(*(*fp3)(int))[10])(bool); 数组函数的返回值是double
完毕!
函数指针的调用
Int function(int a,int b)
{
Return a+b;
}
Int main()
{
//方法一
Int (*fp1)(int,int);
Fp1= &function;
Printf(“fp1 return %d\n”,(*fp1)(3,4));
Printf(“fp1 return %d\n”,fp1(7,4));
//方法二
Int (*fp2)(int,int) = function;
Printf(“fp2 return %d\n”,fp2(4,5));
Printf(“fp1 return %d\n”,(*fp2)(4,7));
Return 1;
}
函数指针数组
定义一组函数
Bool a (int){};
Bool b (int){};
Bool c (int){};
Bool (*Arrfun[])(int) = {a,b,c};
Swctch(type)
{
Case ‘a’:
Arrfun[0](77);
Case ‘b’:
Arrfun[1](88);
Case ‘c’:
Arrfun[2](99);
}