为什么可以用括号表示带有后缀运算符的解引用指针并仍然获得先前的解引用值?

时间:2015-01-09 17:55:11

标签: c++ pointers pointer-arithmetic

我不明白这里的优先顺序。给出:

*(p++)

以下是我认为会发生的事情:

(p++)

然后

*p

为什么p的地址不会先增加,然后取消引用,因为后缀在括号中?

*(p++)

为什么地址不会增加,然后由于括号而取消引用

*p++似乎与*(p++)不同,但它们是相同的。

2 个答案:

答案 0 :(得分:6)

*(p++)中,p的值增加p++,但p++的结果是增量前的值,* }适用于增量前的值。括号是多余的 - 可以说是某人不确定语言的标志。

如果要取消引用递增的值,则需要预先递增:

*(++p)
*++p

请注意,如果您想增加p分的值,请使用:

(*p)++
++*p
++(*p)

最后两个是相同的,只是拼写不同。括号在这三个中的第一个是必要的; *p++*(p++)而不是(*p)++

答案 1 :(得分:2)

这与优先顺序无关。它是关于后缀增量如何工作的。

p ++中发生的事情(假设这个简单例子的p是int*)是:

int* tmp = p; 
p = p + 1; 
return tmp; 

所以你要取消引用p的原始值。