Страницы

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

пятница, 3 января 2020 г.

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

#c #указатели


Изучаю указатели на указатели в Си и возникли небольшие "непонятки".

int **pp, *p, A = 10, B = 20;
p = &A, pp = &p; /* сейчас *p = **pp = 10 */
*pp = &B; /* теперь *p = **pp = 20 */


Кто-нибудь может мне объяснить, почему можно делать так, как мы сделали в строчке
3? Я экспериментально определил, что *pp и p лежат по одному адресу (но для вас это
вряд ли новость), но почему так происходит я не совсем понимаю.
    


Ответы

Ответ 1



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...

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

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