1、等价说法:
指向"指针的指针"的指针。指向”指针数组”的指针。有点绕。
2、预备知识:
*h[3]和(*h)[3]分别指的是什么?
根据运算符的优先级。[]优先*。
所以,*h[3]中的h本质是一个数组,h是数组名,h数组有3个元素。*表明h中的这3个元素是指针。
(*h)[3]中的()使得*和h先结合,所以(*h)[3]中,h本质是一个指针名,指向一个有3个元素的数组。(至于数组元素是什么类型,现有的组合,不能确定,还需要前缀来完善)。
3、函数指针调用及返回值。
a) 函数指针
指向函数的指针。
a.1) 定义方式:
返回类型为指针的函数指针原型(下同):
const double * (*pa)(const double arr[],int n); pa是一个函数指针。
a.2) 调用函数及获取函数返回指针指向的结果:
调用:(*pa)(ar,n)。函数返回值是一个指针double类型的指针。其实允许pa(ar,n)。
获取返回结果: *(*pa)(ar,n)。获取的是函数返回指针指向的结果。也允许*pa(ar,n)。
b) 函数指针的数组
函数指针的数组:是个数组,装的是指针。所以是*h[3]形式的。
b.1) 定义方式:
const double * (*pb[3])(const double arr[],int n); pb是一个函数指针的数组。
b.2) 调用函数及 获取函数返回指针指向的结果:
调用:pb[i](ar,n)。pb是数组名,pb[i]是元素值(只是第i个函数的地址)*pb[i]才是具体的函数。
获取返回结果: *pb[i](ar,n)。
b.3) 使用auto关键字,创建函数指针的数组
用auto关键字再创建一个就可以写为:auto pb2 = pb。
pb2的调用同pb:pb2[i](ar,n)。
获取返回结果:*pb2[i](ar,n)。
c) 指向”函数指针的数组“的指针:使用auto关键字创建
c.1) 定义方式:
指向“指针数组”pb的指针:auto pb3 = &pb。
c.2) 调用函数及 获取函数返回指针指向的结果:
pb3的调用:(*pb3)[i](ar,n)。(注意和下述“d)"的不一样。
获取pb3的结果:*(*pb3)[i](ar,n)。
d) 自定义指向“函数指针的数组”的指针
指向“函数指针的数组”的指针:是个指针,指向一个数组,所以是(*h)[3]形式的,前向再加个*,*(*h)[3]表明数组装的是指针。
d.1) 定义方式:
const double * (*(*pc)[3])(const double arr[],int n); pc是一个指向“函数指针的数组”的指针。
d.2) 调用函数及 获取函数返回指针指向的结果:
调用: (*(*pc)[i])(ar,n)。
获取返回结果: *(*(*pc)[i])(ar,n)。