2

可能重复:
二维数组作为函数的参数

二维数组是如何在 C++ 中实现的?它在内存中是连续的吗?

即如果a是一个数组第一个地址包含元素a(0,0) 然后下一个地址a(0,1)然后a(1,0)a(1,1)等等...?

4

2 回答 2

1

给定一个声明T D[C],其中T是类型名称、D标识符和C整数常量表达式,标准说(突出显示我的):

(§8.3.4/1) [...] 那么标识符的类型 [...] 是一个数组类型。[...] 常量表达式指定数组的(元素数量)边界。如果常量表达式的值为 N,则该数组有 N 个元素,编号为 0 到 N-1,并且 D 的标识符的类型是“NT 的derived-declarator-type-list 数组”。数组类型的对象包含一个连续分配的非空 T 类型的 N 个子对象集。 [...]

和:

(§8.3.4/3)当几个“数组”规范相邻时,创建一个多维数组;[...]

也:

(第 8.3.4/9 节)[注意:由此可知,C++ 中的数组是按行存储的(最后一个下标变化最快),声明中的第一个下标有助于确定数组消耗的存储量,但在下标计算中没有其他作用。——尾注]

结论
所有这一切都清楚地表明这T a[N][M]是一个连续存储对象列表N,每个对象都是一个连续存储的类型对象列表。所以是的,整个二维数组是一个连续存储的对象。MT

这是否意味着您可以使用一个组合索引直接访问元素? 那么,给定一个数组int a[10][5],你可以使用a[0][23]代替a[2][3]吗?严格来说,不,因为这违反了上面的第一条规则,即只有索引0..4对第二个索引有效。但是,就该特定表达式而言,如果您将其视为a[0]指向p数组第一行的第一个元素的指针,并且a[0][23]作为*(p+23),您可以确保访问正确的元素。更多关于这个问题的信息在这个现有的问题中。

于 2012-10-14T07:27:09.020 回答
1

是的,它在行主要顺序中是连续的。假设您有一个名为 的二维数组a[3][3]。然后在内存中的元素将按以下顺序排列:a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2], a[2][0], a[2][1], a[2][2].

这是一个示例的更多详细信息

于 2012-10-14T07:09:41.233 回答