用于访问C中的多维数组的等效语法

时间:2014-05-01 18:43:44

标签: c arrays multidimensional-array

通过knr,我已经达到了多维数组。

我想知道几件事:

首先

假设我初始化以下数组

int a[2][4] = {{1,2,3},{4,5,6}};

现在,我理解为将2个4 * sizeof(int)字节的连续内存放在一边。好吧,所以在我看来它只是一个很好的方式来预留多重定义的内存。所以...为什么以下不正确:

int a[8] == int[2][4]

其次,当我走的时候,

int a[2][3] = {{1,2,3},{2,3,4}};

为什么这次尝试失败

a[5] = 22;

那么,如果它不仅仅是一个连续的内存块,那么多维数组是什么?

3 个答案:

答案 0 :(得分:0)

T a[x][y][z];

a是一个数组(x个元素)数组(每个y个元素)数组{{每个z个元素)T }。

<强>更新

如上定义的数组确实是连续的内存块。

然而,看到像这样的行

T t = b[0][0[0];

不知道如何定义a并不一定意味着b是一个连续的内存块,通过索引b在3个维度中保存所有元素。

阵列可以分散。

例如

T ** c1 = malloc(x * sizeof(*c1));
for (size_t i = 0; i < x; ++i)
  c1[i] = malloc(y * sizeof(**c1));

允许您以与使用

相同的方式访问c1的{​​{1}} * x个元素
y

T c2[x][y]; 个元素存储在一个连续的内存区域中,而c2个元素分散在c1个大小为x的区域中,并附加一个大小的内存块yc1的大小相比x * sizeof(*c1)

答案 1 :(得分:0)

如果您有[a] [4]并尝试访问[1],则a [1]为 int [] ,而不是 int

换句话说,[1]是一个数组,而[1] [1]是一个整数值。

你需要施展才能做你想做的事。

答案 2 :(得分:0)

多维数组 只是一块连续的内存块。但是,当您声明一个变量时,编译器希望您在声明它时使用该变量。因此,如果您将a声明为带有

行的二维数组
   int a[2][4] = {{1,2,3},{4,5,6}};

然后编译器将变量a视为二维数组。

如果您想将该数组作为一维数组访问,那么您需要声明另一个变量,例如

   int *b = (int *)a;

然后您可以使用类似

的代码访问数组的元素
   for ( i = 0; i < 8; i++ )
       printf( "%d %d\n", i, b[i] );

,输出将是

0 1
1 2
2 3
3 0
4 4
5 5
6 6
7 0

注意位置3和7处的零。这些元素为零,因为数组的每一行都声明为包含4个项目,但初始化程序每行只有3个项目。初始化程序中的任何未指定的项都用零填充。