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);  // 正确

 

posted @ 2022-11-15 00:15  失败者_ant  阅读(57)  评论(0编辑  收藏  举报