为什么只有列大小有效,但只有行大小在二维数组初始化中不起作用?

时间:2014-01-16 18:28:49

标签: c arrays

这是有效的

 int a[][2]={
               {2,4},
               {6,8}
            };

但这显示错误

int a[2][]={
              {2,4},
              {6,8}
           };

为什么只给出列大小显示没有错误但只给出行大小会产生错误?

2 个答案:

答案 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是编译时要求的事实