字面看就可以看出二者的区别,指向函数的指针即指针指向的地址为某个函数,而返回指针的函数为某个函数返回值是指针。
下面具体说:
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 = 0;
ptr = example;
bigfun(1, ptr);//输出值为1
bigfun2(1, example);//输出值为1
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、至于返回指针的函数就不再多讲了,与一般函数无二,只是返回值类型为指针而已。