这行得通
int a[][2]={
{2,4},
{6,8}
};
但这显示错误
int a[2][]={
{2,4},
{6,8}
};
为什么只给出列大小不显示错误,但只给出行大小却显示错误?
最佳答案
在 C 中,您只能省略第一维的长度。对于一维数组,你可以这样做
int oneD_array[2] = {1,2};
或
int oneD_array[] = {1,2};
如果是二维数组,两者都是
int twoD_array[2][2] = { {2,4}, {6,8} };
和
int twoD_array[][2] = { {2,4}, {6,8} };
有效。
但是上面的声明只有在初始化器存在的情况下才有效。否则会报错。
编译器使用初始值设定项的长度来确定数组的长度。但是不能通过这种方式确定列的长度。在不知道数组长度的情况下,编译器无法计算出其对应元素的地址。通过知道行和列的长度,编译器使用数组等式计算其元素的地址:
address(array) = address(first element) + (row number * columns + column number)*sizeof)type)
详细看array equation :
C 中的二维数组被视为一维数组,其元素是一维数组(行)。
例如,T
的4x3
数组(其中T
是某种数据类型)可以声明为:T mat [4][3]
,并用以下方案描述:
+-----+-----+-----+
mat == mat[0] ---> | a00 | a01 | a02 |
+-----+-----+-----+
+-----+-----+-----+
mat[1] ---> | a10 | a11 | a12 |
+-----+-----+-----+
+-----+-----+-----+
mat[2] ---> | a20 | a21 | a22 |
+-----+-----+-----+
+-----+-----+-----+
mat[3] ---> | a30 | a31 | a32 |
+-----+-----+-----+
数组元素逐行存储在内存中,所以T
类型的元素mat[m][n]
的数组方程为:
address(mat[i][j]) = address(mat[0][0]) + (i * n + j) * size(T)
address(mat[i][j]) = address(mat[0][0]) +
i * n * size(T) +
j * size(T)
address(mat[i][j]) = address(mat[0][0]) +
i * size(row of T) +
j * size(T)
关于c - 为什么在二维数组初始化中只有列大小有效而只有行大小无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169951/