Логика указателей
Я получил представление о логике указателей в целом, но для меня есть неясный момент, связанный с фрагментом кода.
#include <iostream>
using namespace std;
int main ()
{
int first = 50,
second = 150;
int * p1, * p2;
p1 = &first; //p1 is assigned to the address of first
p2 = &second; //p2 is assigned to the address of second
*p1 = 100; //first's value is changed as 100 by assigning p1's value to 100
*p2 = *p1; //now p2's value should be 100
p1 = p2; //I think we want to change p1's adress as p2
*p1 = 200; //I expect that the new value of p1 should be 200
cout << first << second;
return 0;
}
Программа печатает first=100, а second=200, но, как я прокомментировал выше, я ожидаю, что значение p1 изменилось как 200. Но оно все равно осталось как 100. Какой смысл в этом?
4 ответа
Вы, кажется, путаете значение указателя со значением, на которое указывает указатель.
*p1 = 200; //I expect that the new value of p1 should be 200
p1
является указателем, поэтому его значение на самом деле место в памяти, местоположение first
, (что-то вроде 0xDEADBEAF). После этой строки:
p1 = p2;
p1
остается указывать на место в памяти second
так что когда делаешь
*p1 = 200;
это на самом деле настройка second
в 200
,
p1 = p2
делает p1
указатель на Int, который p2
указывает на. Сейчас p1
указывает на second
, После этой инструкции все изменения *p1
влияет на стоимость *p2
поэтому также second
,
Вы присваиваете значение 100 для местоположения адреса, хранящегося в p1, что нормально. Затем вы перемещаете это значение в p2. Но затем вы снова назначаете p1 = p2, что делает адрес, сохраненный в p2, перемещенным в p1, что вызывает проблему. Прокомментируйте эту строку, и ваш код будет работать как положено.