笔者正在学习C++语言,啃书系列将会持续更新,希望可以同大家一起学习,一起进步。如果文章有帮助的话,记得点赞、收藏、关注一条龙哦。
函数指针是C和C++语言中非常重要的一个知识点。学习函数指针,将函数以指针的形式进行处理可以为工程开发提供很大的便捷。同时,将函数作为参数、作为类型来定义变量,传递参数的操作对于笔者这样的初学者来说也是很神奇。本文就来总结一下函数指针的一些用法。
函数的地址
既然我们要把函数当做一种指针来看待,那就需要知道,在C++语言中,函数在调用时,会访问其所在的地址。
那么要如何得到这个地址呢?
其实很简单,单独的函数名所代表的,就是函数的地址。这点和数组是一样的。
举个例子:
声明函数指针
声明格式
函数指针的声明,使用如下形式:
返回类型 (*函数指针名)(参数列表);
星号代表着它是一个指针类型。而返回类型和参数列表,是函数的特征,表明这个指针指向了何种函数。
有了这个指针,就可以用它来指向一个函数。由于函数名称就代表该函数的地址,所以给函数指针赋值的操作可以写成:
函数指针名 = 函数名;
例如,声明如下函数原型和函数指针:
int f(int,int);
int (*fp)(int,int);
则将fp指向f应写为:
fp = f;
是不是很简单呢?
使用typedef关键字
typedef关键字可以为一种类型命名。
它的一般格式为:
typedef 类型名 新的类型名
执行过这条语句后,新的名称和旧的名称在其作用域内便可以通用。
但是在定义函数指针时,格式稍有不同:
typedef 返回类型(*函数指针类型名称)(参数列表);
也就是说上文中定义指针名称的地方变成了填写函数指针类型名称的地方了。
下套用这个写法,来为刚刚的函数指针类型明一个新的名称用来简化函数的声明;
int f(int,int);
typedef int (*ft)(int,int);
ft fp = f;
可以看到,在执行过第二条语句后,ft 就变成了一个指向返回值为int,参数为两个整型的函数的指针类型。接着,我们定义这个类型的变量 fp 并用它指向这个类型的函数f。
使用auto关键字
在C++11之后,auto 关键字更改了原先的含义,变成了一种可以使编译器自动推理需要的类型的关键字。
也就是说,使用 auto 关键字定义的变量,不需要考虑它是什么类型,编译器会根据赋值自动推理所需要的类型。
因此,上面的声明,使用 auto 还可以写成这个样子:
int f(int,int);
auto fp = f;
这样写可以大大简化定义函数指针的步骤,很简单,很nice
不过,需要注意的是,正是由于auto的自动判断带来的灵活性,要求在使用它的时候务必要确保右值类型的准确!
使用函数指针
在了解过如何声明函数指针之后,接下来介绍如何使用这种指针。
调用函数——两种表示方式
通过指针访问这个指针指向的函数,我们有如下两种方式:
方式一&