c++ 函数指针
函数指针是指向函数的指针。指针的类型由它的返回类型和形参类型共同决定。
例如
bool (*Pf)(const string &, const string &) ;
pf指向一个函数,函数的参数是两个string引用,返回值是bool类型。
注意
bool *pf (const string & ,const string &) ;
名字的括号必不可少,没有括号的话,这个就是一个返回值为bool指针的函数。
使用函数指针
可以将函数指针=0,让指针不指向任何函数。
使用函数指针可以用指针名字直接调用,也可以先解引用指针。
//两种方式等价 bool b1 = pf ("hello","goodby"); bool b2 = (*pf) ("hello","goodby");
函数指针做函数形参
可以是类似函数类型,会被自动转换为函数指针。也可以显式的定义为函数指针
void useBigger( const string &s1,const string &s2, bool pf(const stirng &, const string &) ); void useBigger( const string &s1,const string &s2, bool (*pf) (const stirng &, const string &) );
传递函数实参的时候,我们也可以直接将函数作为实参使用,此时它会自动转换为指针。
useBiger( s1, s2, lengthCompare) ;
函数指针做返回值
虽然不能返回函数,但我们可以返回函数指针。但是编译器不会进自动转换,必须显式的声明。直接声明的形式如下
int (*f1(int) ) (int *, int) ;
按照从内向外的顺序阅读,看到 f1后边有形参列表, 因此 f1是一个函数。 f1前边有一个 *,所以f1 返回一个指针;进一步观察,指针类型也包含一个形参列表,因此指针指向一个函数。该函数的返回类型是int 。
再类如
static void (* set_malloc_handler (void (*f) () ) ) () { //一些代码 }
找到名字set_malloc_handler,后边有形参列表,所以 这是一个函数,形参是一个函数指针,形参的指针返回值为void 。
再往前看,名字前边有一个 * 因此这个函数的返回值也是一个指针,最后边还跟着一个空的形参列表,因此,函数返回的指针也是一个函数指针,这个函数指针的返回值是void。
使用类型别名
我们可以定义自己的类型来使代码简化,清晰。
//下面两种定义等价,Func , Func2是函数类型 typedef bool func (const string &, const string &); typedef decltype(lengthCompare) Func2; //定义函数指针 typedef decltype(lengthCompare) Funcp;
也可以使用 using
//定义类型别名 using F=int (int *,int); using PF = int (*) (int * ,int); //使用别名定义函数 PF f1(int); //正确 F f1(int); // 错误,不能转化 F * f1(int); // 正确
怕什么真理无穷,进一寸有一寸的欢喜