首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这里只更改了p2的值?

为什么这里只更改了p2的值?
EN

Stack Overflow用户
提问于 2020-03-13 02:57:08
回答 2查看 55关注 0票数 0

因此,我对指针的概念还不熟悉,我对下面的示例代码有一个问题。

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
value1 is 10
value2 is 10
value1 is 10
value2 is 20

我不明白为什么value1和value2的新值都不是20。

代码语言:javascript
复制
   p1 = &value1;
   p2 = &value2;
   *p1 = 10;
   *p2 = *p1;   

在这里,它是有意义的。我相信我们已经将p1和p2分配给了value1和value2的地址,然后我们给p1分配了一个可以访问value1地址的值,使得value1 = 10,因为我们设置了p2 = p1,所以对于value2也会发生同样的事情。因此,两个值都等于10。

代码语言:javascript
复制
p1 = p2;
*p1 = 20;

我们设置p1 = p2;然后将*p1的值设为20,但在终端中只输出value2的值为20,这应该分配给p2。为什么这之后value1不等于20,为什么只有value2等于20?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-13 03:02:30

这是因为您只将20赋值给value2

代码语言:javascript
复制
p1 = p2;  // from here both p1 and p2 will be pointing at value2
*p1 = 20; // value2 is assigned 20

存储value变量的内存中的一些地址。

代码语言:javascript
复制
  addr0    addr1 
+--------+--------+
| value1 | value2 |
+--------+--------+

现在来看看你在做什么:

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2020-03-13 03:03:25

在此赋值之后

代码语言:javascript
复制
   p1 = p2;

指针p1现在指向由指针p2指向的变量value2。也就是说,两个指针现在都指向同一个变量。

所以这句话

代码语言:javascript
复制
 *p1 = 20;

正在更改指向的变量value2。

至于这些语句

代码语言:javascript
复制
   p1 = &value1;
   p2 = &value2;
   *p1 = 10;
   *p2 = *p1;

然后在最后一条语句中

代码语言:javascript
复制
   *p2 = *p1;

指针p2所指向的变量value2被赋值给指针p1所指向的变量value1的值。指针本身没有改变。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60660306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档