Итак, я новичок в концепции указателей, и у меня возник вопрос относительно следующего примера кода.
#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?