2010-04-01 35 views

回答

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甚至无效的位置。

+0

您能举个例子吗?如果我有一个[3] [4]编译器只需要一个[] [4],它怎么样?我无法理解这一点。真。 – 2010-04-01 17:04:30

+0

它给编译器提供足够的信息来知道如何将内容放在内存中。如果你有12个元素并告诉它一个[] [],它可以是乘以12的任意两个数字(x和y)。如果你给它一个[] [4],它知道x和4乘以12 ,所以x必须是3.如果它有助于使其合理化,请设置一个基本方程式,其左侧的每个维度和右侧的元素总数。解决超过1个变量是困难的或不可能的。 – ssube 2010-04-01 17:28:33

+0

@peachykeen:这有些误导。计算数组元素的地址时需要使用这些维度。然而,第一个维度是不需要的,因为它不是地址计算所必需的(上限是无关紧要的)。 – 2010-04-01 18:51:44

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] ..

请注意这将如何改变哪个尺寸是查找内存位置所需的。

4

它不是“第二维”(除非你只有2个维度) - 它是“除第一维以外的所有”。例如,你可以有int a[][2][3][4]。没有这些尺寸,就无法计算元素的地址。

相关问题