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

#c #pointers #pointer-address

#c #указатели #указатель-адрес

Вопрос:

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

 #include <iostream>
using namespace std;

int main ()
{
int first = 50, 
second = 150;
int * p1, * p2;

p1 = amp;first;         //p1 is assigned to the address of first
p2 = amp;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. Какой в этом смысл?

Комментарии:

1. p1 = p2 ваше назначение изменило значение указателя, после чего p1 указывает на то же значение, что и p2 , т.е. amp;second

2. Я не понял, с чем вы хотите p1 = p2; . Это заставит p1 указывать на то же место, что и p2 , так что теперь оба p1 и p2 будут указывать на одну и ту же переменную second .

Ответ №1:

Вы, кажется, путаете значение указателя со значением, на которое указывает указатель.

 *p1 = 200;           //I expect that the new value of p1 should be 200
  

p1 является указателем, поэтому его значение на самом деле является ячейкой памяти, местоположением first . (что-то вроде 0xDEADBEAF). После этой строки:

 p1 = p2;
  

p1 остается указывающим на ячейку памяти second , поэтому при выполнении

 *p1 = 200;
  

на самом деле это значение second равно 200 .

Ответ №2:

Как изменяются указатели и их значения в коде

Комментарии:

1. Это хороший графический способ представления того, что происходит, но его трудно прочитать. Рассмотрите возможность разбиения изображения на 4, по одному для каждого этапа, и увеличения их, в частности размера шрифта.

Ответ №3:

p1 = p2 заставляет p1 указатель указывать на int, на который p2 указывает. Теперь p1 указывает на second . Итак, после этой инструкции все изменения *p1 влияют на значение *p2 , поэтому, следовательно, также second .

Ответ №4:

Вы присваиваете значение 100 местоположению адреса, хранящемуся в p1, и это нормально. Затем вы перемещаете это значение в p2. Но затем вы снова назначаете p1 = p2, что приводит к перемещению адреса, хранящегося в p2, в p1, что вызывает проблему. Прокомментируйте эту строку, и ваш код будет работать так, как ожидалось.