C语言的设计者还给我们准备了难以理解的另一种参数数组定义格式,以便让我们知难而退。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

1
2
3
4
float average2(const float (*a)[3], const unsigned int n){
...
return fSum / (n*3);
}

形参中的const float (*a)[3]可以按照如下方式理解:

  • a是一个指针;

  • a所指向的对象为包含3个const float的一维数组。

如果把a视为数组名,则数组的元素也是数组,每个元素数组包含3个const float。换言之,a事实上是列数为3的二维数组。

上述形参a定义中的括号是必须的,如果去掉括号成为const float* a[3],编译器会做出完全不同的解读:

  • a是一个包含3个元素的数组;

  • 数组的元素类型为指向const float的指针,即const float*。

考虑到const float (*a)[3]这种形式的二维数组形参太具有迷惑性,作者建议总是使用const float a[][3]这种语法。如果读者实在不能理解const float (*a)[3]这种语法形式,不必沮丧,作者的感受跟读者一样。