我在哪里可以找到标准中对* p和p [0],*(p + 1)和p [1]之间等价的引用,......?

时间:2015-10-02 11:31:28

标签: c++ language-lawyer c++14

在下面的代码段中,符号*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';

我可以在标准中哪些地方找到这种等价的参考?

2 个答案:

答案 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 - 数组的元素   对象,只要它们存在。 ...