关于指针的算术是关联的吗?

时间:2011-12-06 18:08:01

标签: c++ pointers pointer-arithmetic

如果我说,

int a[] = {1, 2, 3, 4, 5};
int *p = a;

现在,如果我写p + 1 + 2,它是否与((p + 1) + 2)相同?任何证明这个错误的标准参考?

5 个答案:

答案 0 :(得分:4)

只有当你没有超出范围时。例如,在此:

int a[] = {1, 2, 3, 4, 5};
int *p = (a + 10) - 9;
int *q = a + (10 - 9);

p的赋值会调用未定义的行为,而q的赋值则不会。

但是,只要你保持在范围内,你就会期待关联性。

顺便提一下,请注意,在你的问题中,你给出的两件事情的定义是相同的,因为加法(好吧,范围内的加法)是左联想的。也就是说,x + y + z == (x + y) + z,而不是x + (y + z)

答案 1 :(得分:3)

  

§3.7.4.3

     

2 A pointer value is a safely-derived pointer to a dynamic object only if it has pointer-to-object type and it is one of the following: ... the result of well-defined pointer arithmetic (5.7) using a safely-derived pointer value;

     

§5.7

     

3 The result of the binary + operator is the sum of the operands.

听起来很合法。

答案 2 :(得分:2)

指针和整数之间的加法在C ++ 11中定义如下(5.7 / 5):

  

如果表达式P指向数组对象的第i个元素,则为   表达式(P)+ N(等效地,N +(P))和(P)-N(其中N具有   值n)分别指向第i + n和第i-n个元素   数组对象,只要它们存在。

下一句话讨论了一个超过数组末尾的指针。

因此,涉及指针的添加与""相同;涉及索引的加法,当然是关联的。从这里你可以推断出,如果数组元素存在(或者是一个结束),那么涉及指针的添加是关联的。

如果算术超出了指针所指向的数组范围,则行为未定义,因此特别不需要是关联的。

答案 3 :(得分:1)

我在实践中相信是的,但理论上可能没有。

你问p + 3是否与((p + 1) + 2)相同,但是标准说指针算法只在数组中有意义,或者只是在结束时只有一个元素。

答案 4 :(得分:1)

指针实际上只是数字,所以添加将以您描述的方式关联。

编辑:请参阅下面的评论来自delnan - 虽然是,添加将是关联的,我的说法指针只是数字不太正确。