我有以下代码:
int ia[3][4] = { //
{0, 1, 2, 3}, //
{4, 5, 6, 7}, //
{8, 9, 10, 11} //
};
int (*p4)[4] = ia;
cout << "(*(p4 + 0))[3] = " << (*(p4 + 0))[3] << endl;
cout << "*(p4 + 0)[3] = " << *(p4 + 0)[3] << endl;
获取以下输出:
(*(p4 + 0))[3] = 3
*(p4 + 0)[3] = 1
我不明白最后一个它是如何到达 1 的。 任何帮助都会很棒。 谢谢。
我不明白最后一个它是如何到达 1 的。
未定义的行为将您带到了那里。
由于运算符优先级(数组索引运算符比指针取消引用运算符绑定得更紧密(,
*(p4 + 0)[3]
与
:*((p4 + 0)[3])
相同,与:*(p4[3])
相同,与:p4[3][0]
相同。
对于数组。第一维的有效索引为:0
、1
和2
。使用3
的索引值访问数组会访问超出有效范围的内存,从而导致未定义的行为。
后缀表达式的优先级高于一元表达式。
所以这个表达
*(p4 + 0)[3]
等效于表达式
*( (p4 + 0)[3] )
可以看出,它与
( *(p4 + 0) )[3]
这个表达式*( (p4 + 0)[3] )
可以像*p4[3]
一样写成等效于*ia[3]
,并且由于优先级被认为是像
*( ia[3] )
或喜欢
ia[3][0]
数组ia
的第一维索引的有效范围是[0, 2]
,因为数组的声明如下
int ia[3][4] = { /*...*/ };
^^^
因此,表达式ia[3]
尝试访问数组之外的内存。因此,代码段具有未定义的行为。
简而言之,您应该了解这些表达方式
(*(p4 + 0))[3]
*(p4 + 0)[3]
反过来等效于以下一对表达式
ia[0][3]
io[3][0]
由于操作的优先级,它们不等效。