为什么在多维数组中不需要提及第一个维度,但必须提及其他维度:
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 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 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]);
arr[i][j][k]
进行取消引用“相当于” arr[i][j][k] = *(&(arr[0][0][0]) + k + 5 *(j + 4 * i));
而不是将其展示为与声明相同代码的一部分,因为在更多应用程序中无需编写此类行。如果这是我的答案,我会命名数组大小,因为这样很容易阅读,而无需回到声明。 - dmckee --- ex-moderator kittenint 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;