这是有效的
int a[][2]={
{2,4},
{6,8}
};
但这显示错误
int a[2][]={
{2,4},
{6,8}
};
为什么只给出列大小显示没有错误但只给出行大小会产生错误?
答案 0 :(得分:2)
在C中,您只能省略第一维的长度。对于1D阵列,您可以执行
int oneD_array[2] = {1,2};
或
int oneD_array[] = {1,2};
对于2D数组,两者都是
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中的2D数组被视为一维数组,其元素是一维数组(行)。
例如,4x3
T
数组(其中T
是某种数据类型)可以通过:T mat[4][3]
声明,并通过以下方案描述:< / p>
+-----+-----+-----+
mat == mat[0] ---> | a00 | a01 | a02 |
+-----+-----+-----+
+-----+-----+-----+
mat[1] ---> | a10 | a11 | a12 |
+-----+-----+-----+
+-----+-----+-----+
mat[2] ---> | a20 | a21 | a22 |
+-----+-----+-----+
+-----+-----+-----+
mat[3] ---> | a30 | a31 | a32 |
+-----+-----+-----+
数组元素一行一行地存储在内存中,因此类型为mat[m][n]
的元素T
的数组等式为:
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)
答案 1 :(得分:1)
编译器必须将数组转换为线性结构(即存储器地址)。它通过将行号乘以列的宽度然后添加您感兴趣的列号来完成此操作。您可以注意到此计算需要知道宽度(列数)。编译器能够计算行数。
所以内存地址=行号*列数+你感兴趣的列号。无法摆脱number of columns
是编译时要求的事实