#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...
Комментариев нет:
Отправить комментарий