логика указателей - PullRequest
       38

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

0 голосов
/ 08 ноября 2011

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

#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 ]

7 голосов
/ 08 ноября 2011

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

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

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

p1 = p2;

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

*p1 = 200;

фактически устанавливается second в 200.

3 голосов
/ 08 ноября 2011

How the pointers and their values change in the code

1 голос
/ 08 ноября 2011

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

0 голосов
/ 21 июля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...