Как получить значение указателя, адрес через ссылку на указатель?
Подскажите, как это работает? Почему именно так и в чём тут логика? При такой записи
int a = 5;
int* pa = &a;
int*& paref = pa;
и попытке вывода
cout << *&paref << endl; Я получаю значение указателя, адрес. Но почему это так работает?
Но ещё более непонятно, что при выводе cout << &paref << endl; Я получаю адрес, где лежит указатель. С обычной ссылкой вроде понятно разные варианты вывода, а тут просто не могу себя объяснить почему именно так. Интересует именно c++.
Ответы (1 шт):
Начнём с того, что ссылки в С++ разыменовываются автоматически. А значит, вот это "шаманство":
cout << *&paref << endl;
работает так. Сначала, когда Вы написали paref, ссылка уже разыменовалась, т.е. на этом месте уже стоит указатель на a, содержащий значение адреса переменной a. Т.е. paref == pa == &a.
Потом Вы получаете адрес этого указателя с помощью оператора &. Т.е., по сути, &paref == &pa.
Теперь Вы применяете оператор *, тем самым разыменовывая адрес указателя pa и получая снова указатель pa. То есть *&paref == *&pa == pa == paref. Все эти четверо равны!
Таким образом, вместо строки
cout << *&paref << endl;
можно написать
cout << paref << endl;
и получить аналогичный результат.
После объяснений первой строки, думаю, со второй всё стало понятнее. Сначала Вы пишете paref, что уже разыменовывает ссылку. Т.е. paref == pa == &a.
Потом Вы берёте адрес того, что получилось, оператором &. Т.е. &paref == &pa. И тем самым как раз и получаете
адрес, где лежит указатель
P.S. Напоследок небольшая справка по операторам работы с указателями и ссылками:
* – оператор разыменования указателя (получение того значения, которое лежит по адресу, записанному в указателе)
& – оператор получения адреса (возвращает адрес переменной или ещё чего-нибудь)
– оператор разыменования ссылки. Да-да, там ничего нет. Потому что ссылка разыменовывается автоматически.
P.P.S. Если что, заранее прошу прощения за такой жирный акцент на автоматическое разыменование ссылки, если Ваше непонимание было вызвано не этим. Просто, на мой взгляд, именно непонимание данного принципа вызвало у Вас непонимание всего механизма работы.