Почему значение этой переменной равно 0, а не 42? - PullRequest
0 голосов
/ 10 октября 2019

Я только начинаю изучать C, и это довольно запутанно. В частности, меня смущают указатели. Я начинаю думать об этом, но меня смущает, почему эта конкретная вещь не работает так, как я думала.

int num1 = 0, num2 = 1000;
int *pA = &num1, *pB = &num2;

pA = pB;
*pA = 42;

printf("%d\n", num1);
printf("%d\n", num2);

Я знаю, что с точки зрения указателей в моем коде, '*' получает доступ к значению, сохраненному в значении, на которое ссылается указатель. В случае кода ниже, «pA» ссылается на «num1».

Без использования «*» я также знаю, что «pA = pB» говорит о том, что указатель переменной «pA» теперь имееттот же адрес, что и «pB». Это будет означать, что «num1» имеет значение «1000». Затем значение по адресу, на который указывает «pA», меняется на «42». За исключением того, что это не так;«num1» печатает «0» и «num2» печатает 1000.

Пожалуйста, кто-нибудь может объяснить, что идет не так?

Ответы [ 4 ]

4 голосов
/ 10 октября 2019

В этой строке здесь

pA = pB;

Вы устанавливаете значение pA (указатель) на значение pB. Таким образом, теперь он также указывает на num2 (именно на это указывает pB).

Таким образом, когда вы делаете это:

*pA = 42;

Устанавливает num2 в 42.

За исключением того, что это не так;«num1» печатает «0», а «num2» печатает 1000.

Не при попытке.

0 голосов
/ 10 октября 2019

Переменные в C - это фактические ячейки физической памяти, которые содержат значения. Здесь их четыре: num1, который содержит значение 0, num2, который содержит значение 1000, pA, который изначально содержит адрес памяти num1, и pB, который изначально содержит адрес памяти num2.

Когда вы назначаете переменную в C, вы копируете содержимое одной переменной в другую. Таким образом, pA = pB означает «скопировать значение pB в pA». Поскольку pB содержал адрес памяти num2, теперь pA также содержит адрес памяти num2. Позиции памяти num1 и num2 не изменились - они по-прежнему содержат 0 и 1000. Назначение разыменования *pA = 42 говорит «переместить значение 42 в область памяти, содержащуюся в pA». Поскольку pA содержит адрес num2, num2 теперь равен 42 (а num1 остается 0).

0 голосов
/ 10 октября 2019
pA = pB;  //this is assigning the location in memory that pB is pointing to to pA

Таким образом, pA больше не может изменять значение num1, поскольку оно больше не указывает на num1. Теперь он изменит значение того, на что указывает pB.

0 голосов
/ 10 октября 2019

Мне также известно, что «pA = pB» говорит, что указатель переменной «pA» теперь имеет тот же адрес, что и «pB»

Вы не правы. pA и pB - это две разные переменные, которые имеют свои собственные адреса.

Например, вставьте следующий оператор

printf( "&pA = %p, &pB = %p\n", ( void * )&pA, ( void * )&pB );

до и после оператора

pA = pB;

Общим является то, что переменные теперь имеют то же значение, что и адрес переменной num2. Итак, теперь два указателя с одинаковым значением указывают на переменную num2. Используя любой из этих указателей, вы можете изменить значение переменной num2. Адрес переменной num1, ранее сохраненный в переменной pA, теперь теряется, поскольку значение указателя pA было перезаписано в операторе

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