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

Ris*_*hal 8 c c++ arrays multidimensional-array

为什么没有必要提到多维数组的第一维,必须提到其他维度:

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 
Run Code Online (Sandbox Code Playgroud)

我无法理解这背后的概念或逻辑.

hac*_*cks 7

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

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

int 2D_arr[m][n]   
Run Code Online (Sandbox Code Playgroud)

转换成

int (*2D_arr)[n]  
Run Code Online (Sandbox Code Playgroud)

因此,可以省略第一维。但是,必须存在第二维以告诉编译器该指针2D_arr是指向ints数组的n指针。

在第二种情况下,当存在初始化程序时

int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}};    
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*sta 5

因为在使用多维数组时,计算实际索引会使用除第一个之外的所有维度大小.例如,对于声明为3D阵列int arr[3][4][5];,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]);
Run Code Online (Sandbox Code Playgroud)