英文是 a pointer to a Function
一个指向函数的指针,中文叫指针函数还是函数指针,按我的理解是,函数类型应该是指针函数,与普通函数区分开;函数指针估计叫做函数的指针,表明指针函数中的函数有指针,而不普通函数没有。
首先看函数定义:
double pam(int);
函数定义的时候,pam表示函数pam()的地址,注意pam是地址,pam()才是函数。函数调用的时候:
process(think); // 传递函数think()的地址给函数process()
process(think()); // 传递函数think()的返回值给函数process()
但是我用cout输出的时候,输出pam给的结果是个bool类型值1,&pam给的结果是函数地址。说明pam虽然表示地址,但是跟函数的地址还是有区别的,比较绕口,但记住这点,后面有用。
如果用指针 *pf 替换pam,即定义了函数指针:
double (*pf)(int);
注意:*pf是函数,pf是地址(指针). pf指向一个函数,函数名字是(*pf),相pf相当于 &pam;*pf 相当于pam。
(*pf)括号不可少
double (*pf)(int); // pf 指向函数的指针,返回double类型
double * pf(int); // pf()是一个函数,返回double * 类型,这样看double*写一起比较好
指针函数定义之后,可以将指针指向函数,即:
double pam(int);
double (*pf)(int);
pf = pam; // pf 指向函数pam()
记得之前说过的,pam是地址,所以不需要加&;但是,因为&pam也是函数地址,所以pf = &pam,两个含义相同!
如果想调用指针函数,直接调用函数地址即可,定义调用函数的时候:
void estimate(int lines, double (*pf)(int));
第二个参数就是定义指向函数的指针,即指针函数,这个函数的参数是个int类型的数据。
estimate(50, pam); // 函数调用告诉estimate()调用 pam()
传递的只是地址。
定义了指针函数之后就可以像普通函数一样使用
double pam(int);
double (*pf)(int);
pf = pam;
double x = pam(4);
double y = (*pf)(5); // 使用指针pf调用函数pam()
特别的,记得pam和&pam的区别吗?但是指向的时候两个功能是相同的!同理,调用函数的时候*pf和pf也可以通用:
double y=pf(5);