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

9
如果我有以下代码:
int A[5] = { 2, 1, 3, 55 };
int *p = A;
cout << ++(*p);

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

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

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

A 向量发生任何变化时?


15
“*p”返回指向对象的引用,“++”会就地修改该对象。这个内容有什么不清楚的吗? - UnholySheep
1
它并不改变指针的值,你为什么这么想?在打印出指针之前和之后,你会发现它是相同的。 - 463035818_is_not_a_number
2
不要使用 ++(*p) => ++(2) => 3,而是使用 ++(*p) => ++(A[0]) => 3。这里增加的是数组元素 A[0] 的值,而不是整数值 2 - Daniel Langr
2
OP可能在询问括号是否有所不同。他似乎认为括号会丢弃表达式的lvalue属性。毕竟,当我们学习时,我们会提出假设并尝试验证它们,并且放弃错误的假设。 - nalply
它不会改变指针的值;它会改变所指向的东西的值。它这样做的原因是因为代码的翻译是“找到所指向的东西,并将其更改”。 - Karl Knechtel
显示剩余4条评论
3个回答

19

*p不仅仅是“2”,它是一个左值,也就是说这个“2”有一个明确定义的位置。 这个位置上的值会被++运算符修改 - 这是++运算符的定义规定。

如果你不想修改这个值,可以使用+ 1代替:*p + 1


在C/C++中,左值是指具有内存中明确定义位置的值。这个值可以通过赋值、递增、递减来改变。 例如:

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

这里有一篇相当简单的文章,解释了 lvalues / rvalues: https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c


1
对于初学者的C++用户来说,“lvalue”可能有点难理解。如果你也解释一下它是指“引用”,我相信这会帮助初学者! - Klaus

5

++(*p)++p[0] 以及 ++A[0] 都会改变数组的第一个元素。

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

实际上,它并不会改变指针的值。指针的值是存储在 p 中的值,通常称为“地址”或“引用”。它不会改变。


0
值得注意的是,在C++中过度使用'*'通常会让初学者感到困惑。
这里:
int *p = A;

'*' 表示你正在声明 p 作为一个可以存储内存地址(指针)的变量,并将 A 的第一个位置的地址赋值给它(与 &(A[0]) 相同)。

这里:

++(*p)

'

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

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

'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接