C++11 函数指针、指针函数、返回值为函数指针的函数
C++函数指针、指针函数、返回值为函数指针的函数
一、函数指针
函数指针是一种特殊的指针,指向函数,函数返回一个类型。
例如int (*add)(int,int)
定义了一个函数指针add,指向一个函数,函数形参是int/int,返回值是int。
例如int (*pfun)(int,int)
,意味着pfun是一个指针,指向一个函数,函数的返回值是int。
#include <iostream>
using namespace std;
int addfunc(int a, int b)
{
return a+b;
}
int main()
{
int (*add)(int, int) = addfunc; //addfunc函数名转换成函数指针,传递给add
//int (*add)(int ,int) = &addfunc
int result = (*add)(1,2); //解引用函数指针,调用函数
//int result = add(1,2)
cout<<"通过函数指针调用函数得到结果"<<result<<endl;
cout<<"直接调用函数得到结果"<<addfunc(1, 2)<<endl;
return 0;
}
二、指针函数
指针函数是一种返回值为指针的函数。类型名 *函数名(函数参数列表)
,其中的优先级低于()。所以int *pfun(int,int)
等同于 int *(pfun(int,int))
,声明了一个函数pfun,函数形参为int、int,返回值为整型指针*。
#include <iostream>
using namespace std;
int *p(int, int);
//该函数返回一个整型指针
int *f(int a, int b)
{
int *p = (int *)malloc(sizeof(int));
memset(p, 0, sizeof(int));
*p = a+b;
return p;
}
int main()
{
int *p1 = NULL;
p1 = f(1,2); //f(1,2)返回修改后的整型指针,并传递给p1空指针
}
三、返回值为函数指针的函数
这是一个复杂的指针函数,返回值为函数指针(返回值为指针,并且指针指向函数)。
int (*ff(int))(int *, int);
由于优先律,前者也为int (*(ff(int))(int *, int));
首先ff是函数名,ff(int)有返回值,由*可知函数返回值是指针(ff(int)当做指针变量),指针指向另一个函数,函数返回值是int。上述表达过于复杂,一般来说,我们使用typedef声明来简化代码。
int (*PF)(int *, int); //PF是一个函数指针,指向一个返回值为int的函数
typedef int (*PF)(int *,int); //作用同上,PF是一个指针,指向一个函数,有返回值,返回值类型即int
PF ff(int);//PF是函数指针,作为类型来声明ff(int)。那么ff(int)的返回值就是函数指针,即返回值为指向另一个函数的指针
//此外还有尾置指针的表示方法
auto ff(int)->int *(int *,int); //返回一个函数指针
PS 指针数组与数组指针
这里补充一下指针数组和数组指针的概念。
int *point[10];
//point是一个数组,数组的10个元素都是整型指针。(指针数组)->指针构成的数组
int (*point)[10];
//point是一个指针,指向一个含有10个元素的数组,元素都是整型。(数组指针)->数组类型的指针
总结
- 名称后面有(),表示是函数;否则为普通变量。
- *后面出现的表示指针
- 函数名前面的void/int/char等表示返回类型