C++ 指向函数的指针和递归
前言:
函数也有地址, 函数的地址时存储其机器语言代码(即二进制的字节码)的内存的开始地址.通常, 这鞋地址对用户而言, 既不重要, 也没有什么用, 但是对程序却很有用
当知道地址之后, 就可以声明指针, 指针就可以指向函数的地址, 有了地址和指针, 就可以将函数的指针传作为参数传递给另一个函数.
与直接调用另一个函数不同的是, 它允许在不同的时间传递不同的函数地址. 这意味着可以在不同得时间使用不同的函数.
当我们要将函数的地址 作为参数 传给另外一个函数时, 需要有以下三个条件才能达到要求:
1. 获取函数的地址.
2. 声明一个函数的指针.
3. 使用指向函数的指针来调用函数.
一. 获取地址
方法: 直接使用函数名, 不跟任何参数.
例:
有一个函数名为think(), 则 think 就是函数的地址., 作为参数传递时, 直接传递函数名就可以, 如:
process(think)
二. 声明函数指针
声明函数的指针时, 和其他声明其他类型的指针一样, 都需要先确定 这个指针是指向哪一类型数据的指针,
而函数指针特殊的是, 一方面要指定返回类型, 一方面要指定函数的特征标(形式参数列表)
例如以下一个估算时间的函数, 原型如下:
double pam(int) ;
则该函数的对应指针应为:
double (*pf) (int);
返回值 函数名 参数列表
仔细观察发现, 函数指针与函数原型的唯一区别就是, 将函数名pam 改为了(*pf)
即 pam=(*pf)
pam是一个函数, (*pf) 也就是函数
(*pf) 是函数, 那么pf就是函数的指针;
正确声明之后, 就可以进行赋值
pf = pam;
如果指针与函数原型不匹配, 无法成功赋值
成功赋值后, 即可调用
前面说过, (*pf)=pam
所以调用时, 直接将(*pf) 看做pam直接进行替换就行
(*pf)(5)
实际上, C++ 也允许不加*号, 直接使用指针调用函数
pf(5)
但是可读性会较差, 而且容易产生误解.