Страницы

Поиск по вопросам

вторник, 22 января 2019 г.

Указатели, небольшое недопонимание

Изучаю указатели на указатели в Си и возникли небольшие "непонятки".
int **pp, *p, A = 10, B = 20; p = &A, pp = &p; /* сейчас *p = **pp = 10 */ *pp = &B; /* теперь *p = **pp = 20 */
Кто-нибудь может мне объяснить, почему можно делать так, как мы сделали в строчке 3? Я экспериментально определил, что *pp и p лежат по одному адресу (но для вас это вряд ли новость), но почему так происходит я не совсем понимаю.


Ответ

int **pp, *p, A = 10, B = 20; p = &A
В p записан адрес переменной A
pp = &p;
В pp записан адрес переменной p. Значит, *pp - это по сути переменная p, в которой хранится адрес A. Ну, а **pp - это то же, что и *p, т.е. значение по адресу, хранящемуся в p - а там хранится адрес A. Значит, это значение A, т.е. 10.
*pp = &B;
Вспомним, что в pp хранится адрес переменной p, так что *pp по сути получается тем же, что и p. Т.е. запись в *pp сейчас - когда в pp хранится адрес p - то же самое, что запись в переменную p. А записываем мы туда адрес переменной B
А дальше применимы все те же рассуждения, что были сделаны выше, когда в p хранился адрес переменной A...

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

Отправить комментарий