在下面的代码段中,符号*p
相当于p[0]
,*(p + 1)
相当于p[1]
,依此类推。
int* p = new int[3] { 1, 2, 3};
cout << *p << ' ' << *(p + 1) << ' ' << *(p + 2) << '\n';
cout << p[0] << ' ' << p[1] << ' ' << p[2] << '\n';
我可以在标准中哪些地方找到这种等价的参考?
答案 0 :(得分:2)
这在C ++ 14标准草案5.2.1订阅[expr.sub](强调我的)草案中有所介绍:
后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达方式 应具有“T的数组”或“指向T的指针”的类型,另一个应具有无范围的枚举 或者整数类型。[...] 表达式E1 [E2]与*((E1)+(E2))相同(按照定义) [注:有关详细信息,请参见5.3和5.7和 +和8.3.4有关数组的详细信息。 - 注意],
本段引用了5.3
的{{1}}部分,其中说明了:
一元*运算符执行间接:它所应用的表达式应该是指向一个的表达式 对象类型或指向函数类型的指针,结果是引用对象或函数的左值 表达点所指向的。如果表达式的类型是“指向T的指针”,则结果的类型为 “T”。[...]
和*
的{{1}}部分说:
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有类型 指针操作数。 [...]如果 表达式P指向数组对象的第i个元素,表达式(P)+ N(等效地,N +(P)) 和(P)-N(其中N具有值n)分别指向阵列的第i + n和第i-n个元素 对象,只要它们存在[...]
答案 1 :(得分:2)
C ++ 14:
5.2.1订阅
相关部分:
1 ... 表达式
相同(根据定义)5.7
与+
...
5.3.1一元运算符
相关部分:
1一元
E1[E2]
运算符执行间接:应用它的表达式应该是指向它的指针 对象类型或指向函数类型的指针,结果是引用对象或函数的左值 表达点所指向的。如果表达式的类型是“指向*((E1)+(E2))
的指针”,则结果的类型为 “*
。”......
5.7添加剂运算符
相关部分:
5 ...换句话说,如果 表达式
T
指向数组对象的 i -th元素,表达式T
(等效地,P
) 和(P)+N
(其中N+(P)
的值 n )分别指向 i + n -th和 i - n - 数组的元素 对象,只要它们存在。 ...