为什么在声明多维数组时允许省略第一个维度,而不允许省略其他维度?

Why is it allowed to omit the first dimension, but not the other dimensions when declaring a multi-dimensional array?

本文关键字:不允许省 第一个 其他 许省略 声明 数组 为什么      更新时间:2023-10-16

为什么不提及多维数组的第一个维度,而必须提及其他维度:

int A[][][2]={{{1,2},{3,4}},{{4,5},{5,6}}}; // error 
int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}}; // OK 

我不能理解这背后的概念或逻辑

有必要提及二维数组的两个维度,除非它是在函数的形参中,或者如果存在初始化式,则可以省略第一个维度。

当用作函数的参数时,例如

int 2D_arr[m][n]   

转换为

int (*2D_arr)[n]  

因此,第一维可以省略。但是,必须有第二个维度来告诉编译器指针2D_arr是指向的指针,是n int 的数组。

第二种情况,当存在初始化式时

int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}};    

编译器只使用初始化式的长度来计算第一个维度。维度的其余部分必须在声明时显式指定。

因为在使用多维数组时,计算实际索引使用除了第一个维度之外的所有维度大小。例如,对于声明为int arr[3][4][5];的3D数组,arr[i][j][k]根据定义为 *(&(arr[0][0][0]) + k + 5 *(j + 4 * i))

因此,当第一个维度可以从上下文初始化中推断出来,或者可以忽略(当在函数中获得参数时)时,可以省略它。

例子:

int arr[][2] = { 1,2,3,4 };
void setArr(void *container, int arr[][4]);

如果你以静态方式声明一个2D数组…

int arr[3][4];

…那么它的二维性是显而易见的。

如果以动态方式声明2D数组,或者作为指针指向指针的指针…

int r = 3, c = 4;
int** arr = new int*[r];
for (int i = 0; i < r; i++) {
    arr[i] = new int[c];
}

…看起来好像在分配过程中只提到了一个维度,但那是因为首先分配了行,然后分配了列。当获取或设置元素时,像往常一样指定两个维度…

num = arr[1][2];
arr[1][2] = num;
相关文章: