Почему здесь изменяется только значение p2? - PullRequest
0 голосов
/ 12 марта 2020

Итак, я новичок в концепции указателей, и у меня возник вопрос относительно следующего примера кода.

#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. Почему значение1 после этого не равно 20, почему только значение2 равно 20?

Ответы [ 2 ]

5 голосов
/ 12 марта 2020

Это потому, что вы присваиваете 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)
2 голосов
/ 12 марта 2020

После этого присваивания

   p1 = p2;

указатель p1 теперь указывает на переменную value2, на которую указывает указатель p2. То есть оба указателя теперь указывают на одну и ту же переменную.

Таким образом, этот оператор

 *p1 = 20;

изменяет значение указанной переменной2.

Что касается этих операторов

   p1 = &value1;
   p2 = &value2;
   *p1 = 10;
   *p2 = *p1;

затем в последнем выражении

   *p2 = *p1;

переменной value2, на которую указывает указатель p2, присваивается значение переменной value1, на которую указывает указатель p1. Сами указатели не изменились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...