【C++基础】函数指针

函数指针是什么?

顾名思义,函数指针是一个指向函数的指针。官方(《C++prime》)的定义如下:

函数指针指向的是函数,而非对象,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。

声明函数指针

如下有一个普通函数:

bool lengthCompare(const string &s1,const string &s2);

如果想声明 可以 指向该函数的指针的话,则用指针名如 (*p) 替换函数名 lengthCompare 即可,如:

bool (*p)(const string &,const string &); // 注意,*p两端的括号必不可少

如上,p就是一个指向某个(并非一定要指向上面的普通函数,但是它可以指向上面的普通函数)函数的指针,这些函数的返回类型和形参列表都要被限制在函数指针指定的模式下,即函数需要传入两个引用类型的参数,返回的是一个bool类型的值。

使用函数指针

让指针指向函数的方法

上面声明了一个函数指针,接下来我们使用如下几种方法使得函数指针指向一个特定的函数:

p = lengthCompare; // lengthCompare是上面声明普通函数时的函数名
p = &lengthCompare; // 与上面方法等价

如果函数指针指向的函数的返回类型、形参类型有一个不同,都会产生错误;函数指针指向某个函数是一种精准匹配
此外,函数指针可以指向0或者nullptr,此时表示该函数指针没有指向任何函数。

使用函数指针调用函数的方法

bool b1 = pf("hello","world"); // 使用函数指针调用函数
bool b2 = (*pf)("hello","world"); // 与第一种方法等价
bool b3 = lengthCompare("hello","world"); // 与第一种方法等价

函数指针作为形参

形参可以是指向函数的指针,如:

 // 第三个形参是一个函数类型,它会自动转换成函数指针
void useBigger(const string &s1,const string &s2,bool pf(const string & ,const string & ));
// 与上述声明等价,第三个形参是一个函数指针
void useBigger(const string &s1,const string &s2,bool (*pf)(const string &,const string &))

此外,函数可以直接作为 实参 使用:

// 此时第三个函数名会自动转换成函数指针
useBigger(s1,s2,lengthCompare);

返回的指针再指向函数

int (*f1(int))(int*, int);

我们从内向外进行分析:

*f1(int)

上面的f1右侧含有形参列表,代表f1是一个函数,f1前面有 *,然后:

(*f1(int))(int*, int);

我们将 *f1(int) 当做一个整体,左侧是 (*p)(形参列表) 的形式,代表其是一个指向函数的指针,最后:

int (*f1(int))(int*, int);

返回类型是int,表示这个函数需要返回int类型。


版权声明:本文为weixin_43972154原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。