可能重复:
二维数组作为函数的参数
二维数组是如何在 C++ 中实现的?它在内存中是连续的吗?
即如果a
是一个数组第一个地址包含元素a(0,0)
然后下一个地址a(0,1)
然后a(1,0)
,a(1,1)
等等...?
可能重复:
二维数组作为函数的参数
二维数组是如何在 C++ 中实现的?它在内存中是连续的吗?
即如果a
是一个数组第一个地址包含元素a(0,0)
然后下一个地址a(0,1)
然后a(1,0)
,a(1,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
,每个对象都是一个连续存储的类型对象列表。所以是的,整个二维数组是一个连续存储的对象。M
T
这是否意味着您可以使用一个组合索引直接访问元素?
那么,给定一个数组int a[10][5]
,你可以使用a[0][23]
代替a[2][3]
吗?严格来说,不,因为这违反了上面的第一条规则,即只有索引0..4
对第二个索引有效。但是,就该特定表达式而言,如果您将其视为a[0]
指向p
数组第一行的第一个元素的指针,并且a[0][23]
作为*(p+23)
,您可以确保访问正确的元素。更多关于这个问题的信息在这个现有的问题中。
是的,它在行主要顺序中是连续的。假设您有一个名为 的二维数组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]
.