C++ 像访问一维数组一样访问二维数组合法吗?

C++ 像访问一维数组一样访问二维数组合法吗?,c++,language-lawyer,C++,Language Lawyer,可能重复: 考虑以下代码: int array2d[10][10]; int *array1d = array2d[0]; 我从来没有听说过一个实现不起作用,但是通过array1d访问和操作array2d合法吗?标准的哪一部分允许这样做?标准中是否有任何东西阻止实现在每个第二级数组之间插入额外的空间或填充(虽然不是必需的,但仍然如此) 附加问题:是否有一种方法可以访问array2d作为int[100],而不需要重新解释或C型转换?如果内存可用,标准将其作为官方未定义行为的示例,但基本上总是有

可能重复:

考虑以下代码:

int array2d[10][10];
int *array1d = array2d[0];
我从来没有听说过一个实现不起作用,但是通过
array1d
访问和操作
array2d
合法吗?标准的哪一部分允许这样做?标准中是否有任何东西阻止实现在每个第二级数组之间插入额外的空间或填充(虽然不是必需的,但仍然如此)


附加问题:是否有一种方法可以访问
array2d
作为
int[100]
,而不需要
重新解释或C型转换?

如果内存可用,标准将其作为官方未定义行为的示例,但基本上总是有效的。[编辑:以下是我的想法:C99,§J.2(未定义的行为):

  • 数组下标超出范围,即使对象显然可以通过 给定下标(如左值表达式a[1][7]中给定声明int a[4][5])
但我不能完全确定这是否适用,因为您要获取数组开头的地址,并将其转换为指向底层类型的简单指针。]


数组必须是连续的,因此它不能在数组的元素之间插入任何填充。无论你有一个
int
数组还是一个数组,这都是正确的。

这确实是合法的。该标准明确规定多维数组只是更大的一维数组。我没有确切的引用,但我知道它是真的。

你可以把它打包在一个类中,它把它作为一维数组存储在内部。注册C++的模糊竞赛:不是代码> int *ARARY1D=ARARY2D(0);<代码>更简单一点?@ildjarn:没错,我肯定不习惯使用数组。可能是dup:。我最近在2D数组布局上找到了standardese(答案)。不过,我不确定数组
T[n]
的部分在哪里确切地占据了
n*sizeof(T)
的位置。基本上,第一句话中的“contains”让我有点紧张。为什么不使用更强硬的措辞?“Contains”只是给出了一个下限。@Jon C++2003,§5.3.3/2:
sizeof
:应用于数组时,结果是数组中的总字节数。这意味着由n个元素组成的数组的大小是元素大小的n倍。保证
sizeof(T[n])==n*sizeof(T)
(存在)不足以保证行为是正确的。别名分析呢?在OP的代码
array1d
中,是
int[10]
数组中的迭代器——现在假设有一个
int*p=array2d[1]。优化器(将跟踪这些指针从何处初始化)将关心
array1d
p
是否允许访问alias。作为一种语言,C++不是汇编程序,而是编码器和实现之间的一种约定。这里没有别名违反。有
n*m
int,您可以合法地使用
int*
指向其中任何一个,并且它们保证是连续的,因此您可以增加指针以移动到下一个。