这次看《C++ Primer Plus》发现对于只想数组的指针这里还有一点之前没有注意,就是:

将地址运算符&用于数组名时,将返回整个数组的地址,例如&cookies将返回一个32字节的内存块地址。
上面的cookies是书上的一个例子,不过所谓一个32字节的内存地址,就是一个含有8个int(如果int长4字节)的数组的地址(其值也是首字节的地址)。

这点在函数指针的声明时也有说明,
先声明一个函数指针数组pa

1
const double * (* pa[3])(const double *, int);

若我想声明一个指向含有三个函数指针的数组的指针,用auto关键字时可以通过

1
auto pb = &pa;

根据最上面所说的&用于数组名时,返回整个数组的地址,pa是首元素的地址也就和函数指针数组名相同,&操作后返回整个pa的地址,则pb就是指向含有3个函数指针的数组的指针。

手动声明的话如下:

1
const double * (* (*pb)[3])(const double *, int)

这里看似很复杂,其实分拆来看很好理解,

  • 把约定函数特征的部分去掉就只剩下* (*pb)[3]
  • 第一个*是指数组里面的元素是函数的指针
  • (*pb)[3]是指pb是指向含有之前描述的3个元素的数组的指针。

关于数组指针取数组中的值

既然pd指向数组,那么*pd就是数组,而(*pd)[i]是数组中的元素。

愚蠢的我曾经通过数组指针取数组元素的值的时候还用过将数组指针通过指派运算符转换成元素的指针(数组名)然后操作。
也就是下面这样:

1
*((double *)pd + i)

Comments