字面看就可以看出二者的区别,指向函数的指针即指针指向的地址为某个函数,而返回指针的函数为某个函数返回值是指针。
下面具体说:
1、指向函数的指针
bool (*ptr)(int a);
解析:声明指针ptr,指向的函数带有一个int形参,并返回bool型变量。注:*ptr两边的括号是必须的。否则如下:
bool *ptr(int a);
为返回指针的函数,函数名ptr,参数为int 返回bool型指针变量。
2、指向函数的指针的初始化
只能通过0或者同类型的函数或函数指针进行初始化。可以用函数直接初始化,也可以取地址。
int example(int a) { cout << a << endl; return a; } int main() { int (*ptr)(int a);//声明指向函数的指针类型 ptr = 0;//用0初始化,表示不指向任何函数 ptr = example;//同类型函数初始化 或者ptr = &example; ptr(2);//调用此指针即调用同函数,输出2 (*ptr)(3);//使用解引用调用也可以,输出3 return 0; }
3、指针函数调用
对指针函数的调用既是对指向函数的调用,可以不需要解引用(什么叫解引用?int *p = &a; *p;其中*p表示的是p指向的地址a所存储的值,所以这里*p为解引用)
例子看上面的例子代码即可。
4、函数指针作为形参
函数的形参也可以是指向函数的指针。
两种形式表示
void bigfun(int b, int (*ptr)(int a)) {//参数为指向函数的指针 ptr(b); } void bigfun2(int b, int example(int a)) {//参数为某个函数类型 example(b); } int example(int a) { cout << a << endl; return a; } int main() { int (*ptr)(int a); ptr = example; bigfun(1, ptr); bigfun2(2, example); return 0; }
5、返回指向函数的指针
既然可以作为参数,那么也可以返回
如下:int (*fun(int a))(int b);
解析:看着有点困惑,解读的话从里往外,表示一个函数名为fun,带有一个int a的形参,它的返回值是一个指向函数的指针,指向的函数是带有一个int b形参并返回int型的函数。
如果定义为typedef会容易解读
typedef int(*F)(int b);
返回F型的函数:
F fun(int a);
int example(int a) { cout << a << endl; return a; } typedef int(*F)(int a); F fun(int b) { return example; } int main() { int (*ptr)(int a); ptr = fun(2); ptr(3); return 0; }
注:允许将形参定义为函数类型,但函数的返回类型则必须为指向函数的指针,而不能是函数。
func为一个函数类型,不是指向函数的指针
void fun(func);//ok, func is as a parameter
func fun(int a);//error, func can‘t be as a return type
func *fun(int a);//ok, fun returns a pointer to func
6、至于返回指针的函数就不再多讲了,与一般函数无二,只是返回值类型为指针而已。