为什么只有第二个数组维度很重要?

7
为什么编译器只关注二维数组的第二个维度?我无法理解这一点。谢谢。
3个回答

6

因为编译器需要确定如何从内存中访问数据。第一维并不重要,因为当所有其他大小都已给定时,编译器可以计算出项数。

例如:

int a1[] = { 1, 2, 3, 4 }

编译器知道要为4个整数分配空间。现在,有了这个:
int a2[][] = { 1, 2, 3, 4, 5, 6} }

编译器无法确定是a2[1][6]、a2[2][3]、a2[3][2]还是a2[6][1]。一旦告诉它第二个维度,就可以计算出第一个维度。
例如,尝试访问元素a2[1][0]将根据声明产生不同的值。您可能会得到2、3、4甚至无效位置。

请您能否举个例子?如果我有一个a[3][4]的数组,为什么编译器只需要a[][4]就可以呢?我真的无法理解。 - There is nothing we can do
它为编译器提供了足够的信息,以知道如何在内存中布置事物。如果你有12个元素并告诉它a [] [],它可以是任何两个数字(x和y)相乘得到12。如果你给它a [] [4],它知道x和4相乘得到12,所以x必须是3。如果它有助于使它逻辑化,那么用每个维度在左边和元素总数在右边设置一个基本方程。解决超过1个变量是困难或不可能的。 - ssube
@peachykeen:这有点误导人。维度用于计算数组元素的地址。但第一个维度不是必需的,因为它对地址计算没有影响(上限无关紧要)。 - Paul R
“了解如何在内存中布局的信息” - ssube

4

这里的“第二个维度”并不是指只有两个维度的情况,而是指除了第一个维度以外的所有维度。因此,例如可以使用int a[][2][3][4]这样的声明。如果没有这些维度,就无法计算元素的地址。


1
坐下来,想一想如何在已知数组起始位置的情况下找到 a[i][j] 的内存位置。
请注意,C 数组的布局是这样的:a[0][0] a[0][1] a[0][2] ... a[0][M] a[1][0]... 顺便提一下:FORTRAN 数组的布局不同:a[1][1] a[2][1] a[3][1] ... a[N][1] a[1][2] ...
请注意,这会改变需要用哪个维度来查找内存位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接