8.3.4 / 8 N3797:
[实施例:
考虑
int x[3][5]
;这里
x
是一个3×5的整数数组。 当x
出现在表达式中时,它将转换为指向( 三个中的第一个)五元数组的整数。在表达中x[i]
等同于*(x+i)
,x
首先转换为指针 如上所述; 然后将x+i
转换为x
的类型,其中涉及 将i
乘以指针所指向的对象的长度, 即五个整数对象[...]
由于x
的类型是“包含5个整数的3个数组的数组”,我们也有x + i。假设i = 2;
转换为5个整数的3个数组的数组后,x + i
(调用他arr
)元素的值是多少?我的意思是arr[3]
等于什么?
答案 0 :(得分:0)
arr[3]
是一个包含五个整数的数组。原因如下:
当x出现在表达式中时,它会转换为指向( 三个中的第一个)五元数组的整数
这意味着在表达式中使用arr
会导致类型int(*)[5]
(腐朽)。
对于x[3]
,相当于*(x+i)
,您首先将x翻译为int(*)[5]
类型并推进,然后取消引用(请记住*)该指针因此得到类型int[5]
。
不幸的是,指针指向无效的内存点,因此对此五个整数数组的任何操作都是未定义的行为/访问冲突。
我同意这篇文章对此并不清楚,似乎这两个句子是一个接一个的(有点模糊不清)。
我会把它改为:
这里x是3×5的整数数组。当x出现在表达式中时 它被转换为指向(三个中的第一个)五元的指针 整数数组。在表达式x [i]中相当于 *(x + i),x首先被转换为如上所述的指针;在指针递增x + i之后(以字节方式将i乘以长度) 指针指向的对象,即五个整数对象),x + 1将转换为x指向的类型 [...]