Подтвердить что ты не робот

Как получить указатель из ссылки?

Кажется, много вопросов, связанных с указателем и ссылкой, но я не мог найти то, что хочу знать. В принципе, объект передается по ссылке:

funcA(MyObject &objRef) { ... }

Внутри функции я могу получить указатель на этот объект вместо ссылки? Если я обрабатываю ссылку objRef как псевдоним MyObject, может ли &objRef дать мне указатель на объект MyObject? Это не кажется вероятным. Я смущен.

Изменить: при ближайшем рассмотрении objRef возвращает мне указатель на объект, который мне нужен. Большинство из вас дало мне правильную информацию/ответ, большое спасибо. Я пошел на ответ, который представляется наиболее показательным в этом случае.

4b9b3361

Ответ 1

Да, применение адреса оператора к ссылке совпадает с адресом исходного объекта.

#include <iostream>

struct foo {};

void bar( const foo& obj )
{
  std::cout << &obj << std::endl;
}

int main()
{
  foo obj;
  std::cout << &obj << std::endl;
  bar( obj );

  return 0;
}

Результат:

0x22ff1f
0x22ff1f

Ответ 2

Любой оператор, применяемый к ссылке, фактически применим к объекту, к которому он относится (§5/5 [expr]); ссылку можно рассматривать как другое имя для одного и того же объекта. Таким образом, обращение к адресу ссылки даст вам адрес объекта, на который он ссылается.

Как вообще не указано, требует ли ссылка для хранения (§8.3.2/4 [dcl.ref]), и поэтому было бы бессмысленно брать адрес самой ссылки.

В качестве примера:

int x = 5;
int& y = x;
int* xp = &x;
int* yp = &y;

В приведенном выше примере xp и yp равны - то есть выражение xp == yp оценивается как true, потому что они оба указывают на один и тот же объект.

Ответ 3

Общее решение заключается в использовании std::addressof, как в:

#include <type_traits>

void foo(T & x)
{
    T * p = std::addressof(x);
}

Это работает независимо от того, перегружает ли T operator& или нет.

Ответ 4

Используйте оператор адреса в ссылке.

MyObject *ptr = &objRef;

Ответ 5

Используйте оператор address-of (&) в ссылке.

&objRef

Как и любой другой оператор, используемый для ссылки, это фактически влияет на упомянутый объект.

Как указывает @Kerrek, поскольку оператор влияет на упомянутый объект, если у этого объекта есть перегруженная функция operator&, это вызовет его вместо этого, а std::address_of потребуется для получения истинного адреса.

Ответ 6

В С++ ссылка является ограниченным типом указателя. Он может быть назначен только один раз и никогда не может иметь значение NULL. Ссылки наиболее полезны при использовании для указания того, что параметр функции передается по ссылке, где передается адрес переменной. Без ссылки вместо этого используется значение "Повести".