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];Herexis 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 注]
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |