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