本节将对函数指针进行简单的介绍。
一、函数指针的声明
先来了解一下函数的地址我们该怎么获取。其实和数组差不多,函数名指代的就是函数的地址。
接着,看一下如何声明函数指针:
int func(float);//定义的函数
int (*p)(float);//声明的函数指针
p = func;//对指针进行初始化赋值
从上面的代码不难发现规律,函数指针的声明就是将原来的函数名改为(*p),其中p就是指针变量的名字。
那为什么要这样子设置呢?我们先想一下当我们声明普通数据类型的指针的时候,我们需要指定该指针所指向的区域的数据类型。同理,当我们声明函数指针的时候,同样需要指定函数的类型。函数的类型由其返回值和参数列表确定,所以,在声明函数指针的时候,需要指出该指针指向的函数的返回值类型以及参数列表。这里需要注意的是,函数指针的返回值类型和参数列表必须和原函数一致,否则会导致赋值失败。
其次为什么需要将指针用括号括起来?这就涉及到了优先级的问题,*操作符的优先级低于()。直观地来看,如果我们定义的是:
int *p(float);
那么这其实是一个返回值为int*类型的函数,所以我们需要加括号,从而能够正确地声明函数指针。
其实,如果 你怕自己写错声明,那么可以使用C++的类型推断功能——auto,使用它的代码如下:
int func(float);//定义的函数
auto p = func;//对指针进行声明并初始化赋值
二、函数指针的使用
和普通变量指针一样,我们可以使用*操作符来进行解引用操作,需要注意的是添加括号,确保优先级:
int func(float);//定义的函数
int (*p)(float);//声明的函数指针
p = func;//对指针进行初始化赋值
int x = (*p)(6.0);
此外还有一种使用方式:
int func(float);//定义的函数
int (*p)(float);//声明的函数指针
p = func;//对指针进行初始化赋值
int x = p(6.0);
但是建议使用第一种方式,这种方式有助于代码的阅读。让读者知道此处使用的是函数指针而不是函数。