为啥 ++(*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);
结果是3
,A
的第一个位置的值也是3
,为什么?
我的意思是,按运算符的层次结构()
比++
更分层,那么我们需要先操作*p
:
++(*p) => ++(2) => 3
A
向量有什么变化?
【问题讨论】:
*p
返回指向对象的引用,++
修改它。这有什么不清楚的地方?
它不会改变指针的值,你为什么这么认为?打印前后指针,你会看到是一样的
使用++(*p) => ++(A[0]) => 3
,而不是++(*p) => ++(2) => 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) 会改变指针值?的主要内容,如果未能解决你的问题,请参考以下文章