c++ - 为什么这里只有 p2 的值发生变化?
问题描述
所以我对指针的概念很陌生,我对以下示例代码有疑问。
#include <iostream>
using namespace std;
int main()
{
int value1 = 5, value2 =15;
int * p1, * p2;
p1 = &value1;
p2 = &value2;
*p1 = 10;
*p2 = *p1;
cout << "value1 is " << value1 << "\n";
cout << "value2 is " << value2 << "\n";
p1 = p2;
*p1 = 20;
cout << "value1 is " << value1 << "\n";
cout << "value2 is " << value2 << "\n";
return 0;
}
输出:
value1 is 10
value2 is 10
value1 is 10
value2 is 20
我不明白为什么 value1 和 value2 都没有 20 作为它们的新值。
p1 = &value1;
p2 = &value2;
*p1 = 10;
*p2 = *p1;
这里说得通。我相信我们已经将 p1 和 p2 分配给了 value1 和 value2 的地址,然后我们为 p1 分配了一个可以访问 value1 的地址的值,使得 value1 = 10,并且由于我们设置 p2 = p1,value2 也会发生同样的情况。因此,这两个值都将等于 10。然后在行中
p1 = p2;
*p1 = 20;
我们设置 p1 = p2; 然后给 *p1 一个值 20,但在终端中只输出 value2 的值为 20,应该分配给 p2。为什么在这之后 value1 不等于 20,为什么只有 value2 等于 20?
解决方案
这是因为您只分配20
给value2
:
p1 = p2; // from here both p1 and p2 will be pointing at value2
*p1 = 20; // value2 is assigned 20
value
内存中存储变量的一些地址。
addr0 addr1
+--------+--------+
| value1 | value2 |
+--------+--------+
现在到你在做什么:
p1 = &value1; // p1 = addr0
p2 = &value2; // p2 = addr1
*p1 = 10; // dereference p1 and assign 10 (value1 = 10)
*p2 = *p1; // dereference p2 and assign the value from the dereferenced p1
// (value2 = value1)
p1 = p2; // assign p1 the address p2 is pointing at (p1 = addr1)
*p1 = 20; // dereference p1 and assign 20 (value2 = 20)
推荐阅读
- java - 使用 apache poi 合并单词表中的单元格时如何保持单元格宽度?
- assembly - RISCV函数使用寄存器
- python - 使用 Python 对象进行简单切片
- java - dd-MMM-yy 日期格式错误
- angular - Highcharts:从标记到轴画线?
- python - 这在 Python 中是什么样的方法?
- cas - OAuth2 JWT Token CAS Apereo 6.1.7 版中的密码“clientSecret”参数
- indexing - 如果 Janusgraph 有大约 70G 的数据,它重新索引大约需要多长时间
- .net-core - 我可以使用实体核心仅读取/更新实体的一部分吗?
- c# - 为什么Entity Framework linq查询的内部SQL中没有GroupBy子句?