函数指针,是指向函数的指针。定义函数指针是,要指明函数的返回类型和形参列表。

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);