pep*_*ico 5 c c++ multidimensional-array language-lawyer
我偶尔会使用多维数组,并且很好奇标准所说的(C11和/或C++ 11)索引的行为,其"维度"小于为数组声明的索引.
鉴于:
int a[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
Run Code Online (Sandbox Code Playgroud)
标准是说什么类型a[1]
,或者a[0][1]
,它是否合法,以及它是否应该按预期正确地索引子数组?
auto& b = a[1];
std::cout << b[1][1];
Run Code Online (Sandbox Code Playgroud)
m[1]
只是类型int[2][2]
.同样m[0][1]
也是int[2]
.是的,索引作为子数组的工作方式与您的想法一样.
我认为 C11 中的这个例子已经隐含地解释了这一点。
\n\n\n\n\nC11 6.5.2.1 数组下标
\n\n示例 考虑由声明定义的数组对象
\nint x[3][5];
Herex
is a 3 \xc3\x97 5 ints array; 更准确地说,x
是一个由三个元素对象组成的数组,每个元素对象都是一个由五个整数组成的数组。在表达式 中x[i]
,它相当于(*((x) + (i)))
,x
首先被转换为指向五个 int 的初始数组的指针。然后i
根据 的类型进行调整x
,从概念上讲,这需要乘以i
指针所指向的对象的大小,即五个int
对象的数组。将结果相加并应用间接寻址以生成五个整数的数组。当在表达式 中使用时x[i][j]
,该数组依次转换为指向第一个整数的指针,因此x[i][j]
产生一个int
.
类似的是 C++11 8.3.4 数组
\n\n\n\n示例:考虑
\n\nRun Code Online (Sandbox Code Playgroud)\n\nint x[3][5];\n
这
\nx
是一个 3 \xc3\x97 5 的整数数组。当x
出现在表达式中时,它会转换为指向(三个)五成员整数数组的指针。x[i]
在等价于 的表达式中*(x + i)
,x
首先按照所述转换为指针;然后 x + i 转换为 的类型x
,这涉及乘以i
指针所指向的对象的长度,即 5 个整数对象。结果被相加并应用间接寻址以生成一个数组(包含五个整数),该数组又被转换为指向第一个整数的指针。如果还有另一个下标,则同样的参数再次适用;这次结果是一个整数。\xe2\x80\x94end 示例] \xe2\x80\x94end 注]