函数指针,是指向函数的指针。定义函数指针是,要指明函数的返回类型和形参列表。
int (*p)(int,int); //定义一个函数指针
p是一个函数指针,它指向函数的返回类型为int类型,用两个int类型的形参。
给函数指针赋值
当我们把函数名作为一个值使用时,该函数自动转化为指针。所以可以用函数名直接给函数指针赋值,也可以将变量地址赋值给函数
int Max(int x,int y){ return x>y?x:y; } int (*pf)(int ,int); pf = Max; // pf指向名为Max的函数 pf = &Max; // 与上面一条语句等价
对应的,调用函数指引也有直接调用和解引用调用两种形式。
int x = 3,y = 10,c; c = pf(x,y); c = (*pf)(x,y); //和上一种方式等价
函数指针做形参
形参可以声明为指向函数的指针。
bool useBigger(const string&s1,const string&s2,bool (*pf)(const string&,const string&));
形参也可以直接写为函数类型,但是会被隐式转换为函数指针使用。
bool useBigger(const string&s1,const string&s2,bool pf(const string&,const string&));
函数指针做返回值
函数可以返回函数指针。定义函数时,要把返回类型写成函数指针形式。
int (*f(int))(int*,int);
这种写法比较难懂,要从内而外分析。首先f(int)是一个形参为int类型的函数,f前面有*,所以f1返回一个指针,*f1前面被(),且后面有形参列表,所以返回的指针类型指向函数,最后,该函数返回的类型为int。
为了便于理解,也可以使用类型别名,这里有两种写法:
//1. 返回函数类型的指针 using F = int(int*,int); //F是函数类型 F*f1(int); //2.直接返回函数指针 using PF = int(*)(int*,int);//PF是函数指针 PF f1(int);