为啥 ++(*p) 会改变指针值?

Posted

技术标签:

【中文标题】为啥 ++(*p) 会改变指针值?【英文标题】:Why ++(*p) changes the pointer value?为什么 ++(*p) 会改变指针值? 【发布时间】:2020-07-13 08:05:05 【问题描述】:

如果我有这个代码:

int A[5] =  2, 1, 3, 55 ;
int *p = A;
cout << ++(*p);

结果是3A的第一个位置的值也是3,为什么?

我的意思是,按运算符的层次结构()++ 更分层,那么我们需要先操作*p

++(*p) => ++(2) => 3 

A 向量有什么变化?

【问题讨论】:

*p 返回指向对象的引用,++ 修改它。这有什么不清楚的地方? 它不会改变指针的值,你为什么这么认为?打印前后指针,你会看到是一样的 使用++(*p) =&gt; ++(A[0]) =&gt; 3,而不是++(*p) =&gt; ++(2) =&gt; 3。数组元素A[0] 递增,而不是整数值2 ++ 的全部意义在于改变操作数。为什么你希望它不会那样做? OP 可能在问括号是否有区别。他似乎认为括号丢弃了表达式的左值性。毕竟,当我们在学习时,我们会提出假设并尝试验证它们并丢弃错误的假设。 【参考方案1】:

*p 不只是“2”,它是一个左值,即这个“2”有一个明确定义的位置。 此位置的值由 ++ 运算符修改 - 根据 ++ 运算符的定义。

如果您不想修改该值,请改用+ 1*p + 1


在 C/C++ 中,lvalue 是在内存中具有已定义位置的值。这个值可以改变——通过赋值、递增、递减。 例如,

int x = 0;
x = 1; // ok, x is an lvalue, assignment changes the value from 0 to 1

int *p = &x;
*p = 2; // ok, *p is an lvalue, assignment changes the value from 1 to 2

相比之下,rvalue 是没有定义位置的值 - 例如,算术运算的结果。该值不能赋值、递增或递减(这并不意味着它不能在更大的表达式中使用)。

例如,

int x = 0, y = 1;
(x + y) = 3; // compilation error, (x + y) is an rvalue

2++; // compilation error, 2 is an rvalue

这是一篇非常简单的文章,解释了左值/右值:https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c

【讨论】:

对于新手 c++ 用户,“左值”可能有点难以阅读。如果您还解释说它是“参考”,我相信会对初学者有所帮助!【参考方案2】:

++(*p)++p[0]++A[0] 相同,都改变了数组的第一个元素。

为什么 ++(*p) 会改变指针值

它没有。指针值是保存在p 中的值。它被称为“地址”或“参考”。它不会改变。

【讨论】:

【参考方案3】:

值得注意的是,在 C++ 中过度使用“*”通常会使新手感到困惑。

这里:

int *p = A;

'*' 表示您将 p 声明为可以存储内存地址(指针)的变量,并分配 A 的第一个位置的地址(与 &(A[0]) 相同)。

这里:

++(*p)

' *' 表示您正在查看 'p' 内容(取消引用 'p' 的地址,它与 'A[0]' 的地址相同)。然后'++'增加反映两者的值。

只是为了确认,在这个赋值之后 (int *p = A;) 打印 'p'、'A' 和 '&A[0]' 的值。

【讨论】:

以上是关于为啥 ++(*p) 会改变指针值?的主要内容,如果未能解决你的问题,请参考以下文章

C语言,用指针方式定义的字符串为啥不能修改?

为啥传递给函数的指针的值没有改变? [复制]

结构中的指针分配不工作,为啥值没有改变?

我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?

为啥调用函数时指针会改变地址?

为啥在执行递增操作之前分配指针值