首页 > 解决方案 > 指针:*p++ 作为左值和右值的区别

问题描述

所以我对指针的一件事感到困惑。让我们看看这个:

*p++

我知道运算符 ++ 比运算符 * 更大(对不起,我不是说英语,我不是说英语的人)。所以这意味着 *p++ 实际上被理解为 *(p++)。因此,当 *p++ 用作左值和右值时,让我感到困惑的是不同的结果。例如:

如果我想对数组的所有元素求和,这将正常工作(用作右值):

sum += *p++;

我的问题是为什么它首先发生 *p 然后是 p++,当 ++ 大于 *. 为什么它不会首先发生 p++ 然后 *p。

但如果我将它用作左值,它会按我的预期工作。例如:

*p++ = round(*p * 100) / 100;

它首先发生 p++,然后这个新数字被赋予 *p。

为什么这两个东西是不同的,当它被用作右值和左值时,我的意思是我很困惑为什么这个例子与 sum。

谢谢 :)

标签: cpointers

解决方案


Postfix++优先级高于 unary *,因此*p++被解析为*(p++). 换句话说,您正在申请 *结果p++

结果p++的当前值p。作为副作用p增加 1。对于指针,这意味着p更新以指向序列中的下一个对象。IOW,如果你有这种情况:

+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
  ^
  +---+
      |
    +---+
 p: |   |
    +---+

然后在执行p++(或p = p + 1)之后,您将拥有以下内容:

+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
      ^ 
      |
      |
    +---+
 p: |   |
    +---+

无论序列中对象的类型如何,都是如此,因此存储的地址值p可能会增加超过 1。


推荐阅读