标准是否定义了`a [i]`的类型,其中`a`是`T [M] [N]`?

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)

Dre*_*wen 5

m[1]只是类型int[2][2].同样m[0][1]也是int[2].是的,索引作为子数组的工作方式与您的想法一样.

  • 因为它是一个自动引用,我想它不会衰减到指针. (2认同)

Yu *_*Hao 2

我认为 C11 中的这个例子已经隐含地解释了这一点。

\n\n
\n

C11 6.5.2.1 数组下标

\n\n

示例 考虑由声明定义的数组对象int x[3][5];Here xis 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.

\n
\n\n

类似的是 C++11 8.3.4 数组

\n\n
\n

示例:考虑

\n\n
int x[3][5];\n
Run Code Online (Sandbox Code Playgroud)\n\n

x是一个 3 \xc3\x97 5 的整数数组。当x出现在表达式中时,它会转换为指向(三个)五成员整数数组的指针。x[i]在等价于 的表达式中*(x + i)x首先按照所述转换为指针;然后 x + i 转换为 的类型x,这涉及乘以i指针所指向的对象的长度,即 5 个整数对象。结果被相加并应用间接寻址以生成一个数组(包含五个整数),该数组又被转换为指向第一个整数的指针。如果还有另一个下标,则同样的参数再次适用;这次结果是一个整数。\xe2\x80\x94end 示例] \xe2\x80\x94end 注]

\n
\n