C++ 函数指针2
对于以下三个函数
const double *f1(const double ar[],int n)
const double *f2(const double [],int n)
const double *f3(const double* ,int n)
第一个参数虽然是三种形式, 但是表达的都是一种意思, 因此
可以使用一个函数指针的数组来同时存储这三个函数的指针
和之前的方法一样, 将函数原型的函数名, 改为 (*pf) , 注意指针数组方括号的位置,
如果位置不对, 没有加括号, 就会导致意义有偏差. 因为 [] 运算符 的优先局 大于 *
const double *(*pf[3] )(const double* ,int n) = {f1, f2, f3}
注意:
虽然左边的数组看起来很复杂, 但是不能够使用auto 关键字让编译器自行推断类型,
因为auto 只能用于单值初始化, 不能用于列表初始化.
但是当pf 确定之后, 就可以使用auto 关键字了:
auto pa = pf
当有了数组之后, 数组中的每个元素都指向一个函数 , 所以可以按以下方式调用:
pa[0](3.14,3) 或者 *(pa[1])(3.14,3)
因为要函数原型返回的是 double *类型的数据, 所以, 想取得返回值, 可以在外面再加一个 * 号 解引用
double x= *pa[0] ( 3.14, 3)
可以做的另一件事是, 创建一个指向数组的指针, 即指针的指针, 双重指针, 这个双重指针的地址为, 含有三个函数指针的数组 的地址;
虽然听起来很复杂, 但是因为满足单值初始化的条件, 所以可以用auto 关键字自行推断
auto pc = &pa;
则此时, 从双重指针中调用函数的代码就变为
(*pc)[0](3.14,3)
如果把 auto 拆开来看, 他的原型应该如下:
const double *(*(*pd)[3]) (const double *, int ) = &pa;
很复杂, 有三个*号, 一个一个来看
最左边的*号, 意思是声明指针的原型是double * 类型, 所以最左边的 * 和double 解释在了一起. 意为函数返回值是double * 类型
左边第三个*号, 意思是 声明了一个长度为3 的数组, 数组的内容存放的是函数的指针.
左边第二个*号, 意思是一个指针, 指向了一个数组.
再次强调 &pa 和pa 的不同
假设pa 是一个数组名
&pa 代表着整个数组的起始地址
pa 代表第一个元素的地址
虽然值一样 但是pa +1 和&pa +1 却有很大区别
另一个区别体现在
要得到第一个元素的值,
**&pa== *pa = pa[0]