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]

原文地址:https://www.cnblogs.com/derek-dhw/p/10451015.html