C语言中访问多维数组的等价语法

C语言中访问多维数组的等价语法,c,arrays,multidimensional-array,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; 如果多维数组不

通过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;
如果多维数组不仅仅是一个连续的内存块,那么它是什么呢

T a[x][y][z];
a
T
类型的数组(每个
z
元素)的数组(每个
x
元素)的数组(每个
y
元素)

更新

上面定义的数组实际上是一个连续的内存块

但是看到这样一条线,

T t = b[0][0[0];
   for ( i = 0; i < 8; i++ )
       printf( "%d %d\n", i, b[i] );
如果不知道
a
是如何定义的,并不一定意味着
b
是一个连续的内存块,它包含所有可以通过索引
b
在三维空间中访问的元素

阵列可以分散

比如说

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

c2
元素存储在一个连续的内存区域中,而
c1
元素分散在
x
大小
y
的区域中,如果您有int a[2][4],那么额外的
c1
大小的内存块是
x*sizeof(*c1)
c2
的大小相比如果尝试访问a[1],a[1]是int[]而不是int

换句话说,[1]是数组,[1][1]是整数值

您需要强制转换才能执行所需操作。

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

   int a[2][4] = {{1,2,3},{4,5,6}};
然后编译器将把变量
a
视为二维数组

如果希望以一维数组的形式访问该数组,则需要声明另一个变量,例如

   int *b = (int *)a;
然后您可以使用如下代码访问数组的元素

T t = b[0][0[0];
   for ( i = 0; i < 8; i++ )
       printf( "%d %d\n", i, b[i] );

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

int a[2,3]
将无法编译。captaincurrie,也许您应该编辑您的问题详细信息并修复int a[2,3]?(正如alk发现的那样)
inta[8]==int[2][4]
也是不合法的C
inta[2,3]
inta[3]
一样,不幸的是。@DietrichEpp:我也想到了这一点,但快速测试显示至少GCC4.7.2拒绝了它,错误是“,”token之前的“].”,不是高级python数组。我的困惑源于C中的“低级”数组;“连续内存块”,而不是超级抽象对象。多维数组的这种解释是错误的吗?这就是我真正想知道的“高级”、“低级”、“Python”我不明白你的意思?在C中声明数组只有一种方法。@captaincurrie我觉得在更高级的语言中,像Python一样,数组是更抽象的对象,因为它们的行为方式是这样的。而在C语言中,如果不理解“低级”的“现实”是“连续的内存块”,就不能使用数组。我的困惑源于未能理解C多维数组的底层现实