Логика указателей

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

#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, что вызывает проблему. Прокомментируйте эту строку, и ваш код будет работать как положено.

Другие вопросы по тегам