C++ 二维数组是如何在C++;

C++ 二维数组是如何在C++;,c++,C++,可能重复: 如何在C++中实现二维数组?它在内存中是连续的吗 i、 e如果a是一个数组,那么第一个地址包含元素a(0,0)然后下一个地址a(0,1)然后a(1,0),a(1,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] 给定一个声明td[C],其中T是一个类型名称,D是一个标识符,C是一个整

可能重复:

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


i、 e如果
a
是一个数组,那么第一个地址包含元素
a(0,0)
然后下一个地址
a(0,1)
然后
a(1,0)
a(1,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]


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

(§8.3.4/1)[…]那么标识符的类型[…]是数组类型。[…]常量表达式指定了数组(元素数)的界限。如果常量表达式的值为N,则数组有N个编号为0到N-1的元素,D的标识符类型为“N T的派生声明器类型列表数组”。数组类型的对象包含一个连续分配的非空集合,其中包含T类型的N个子对象。[…]

以及:

(§8.3.4/3)当多个“阵列”规格相邻时,创建多维阵列;[……]

以及:

(Po.83.4/9)[注:从这一切来看,C++中的数组是行存储的(最后下标变化最快),阿纳尔声明中的“rST下标”有助于确定数组所消耗的存储量,但在下标计算中没有其他部分。-EntNote

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

这是否意味着您可以使用一个组合索引直接访问元素?
那么,给定一个数组
inta[10][5]
,您可以使用
a[0][23]
而不是
a[2][3]
?严格地说,不是,因为这违反了上面的第一条规则,即只有索引
0..4
对第二个索引有效。但是,就特定的表达式而言,如果要考虑“代码> a(0)< /代码>作为数组第一行的第一个元素的指针<代码>代码>代码>,和<代码> A[ 0 ] [ 23 ] < /代码>作为<代码>(P+23)< /C> >,您可以确保访问正确的元素。关于这个问题的更多信息,请参阅。

@CodingMash。这个问题是答案的副本吗?