您要查找的内容可以在[dcl.array]/6
中找到
类型为“ N U的数组”的对象包含一个连续分配的非空的N个子对象集,该子对象的类型为U,称为数组的元素,编号为0到N-1。
这说明,如果您有一个像int arr[10]
这样的数组,那么要有10个int
在内存中是连续的。尽管此定义可以递归工作,但如果有
int arr[5][10]
那么您拥有的是5个int[10]
数组的数组。如果从上面应用定义,那么我们知道5个int[10]
数组是连续的,然后int[10]
本身是连续的,因此所有50个int
都是连续的。因此,是的,二维数组看起来就像内存中的一维数组,因为实际上就是它们。
这并不意味着您可以获得指向arr[0][0]
的指针并使用它来迭代至arr[4][9]
。每个[expr.add]/4
将具有整数类型的表达式J添加到指针类型的表达式P或从其中减去时,结果的类型为P。
这说明,如果您有一个指向数组的指针,则可以添加到其中的有效索引为[0,array_size]
。所以如果你这样做
int * it = &arr[0][0]
然后it
指向的是第一个数组的第一个元素,这意味着您只能合法地将it
递增到it + 10
,因为这是第一个数组的过去然后结尾的元素。进入第二个数组的是UB,即使它们是连续的。
本文链接:https://www.f2er.com/3164806.html