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

Есть ли способ найти адрес ссылки?

Есть ли способ найти адрес ссылки?

Сделать его более конкретным: адрес самой переменной, а не адрес переменной, с которой она инициализирована.

4b9b3361

Ответ 1

Ссылки не имеют собственных адресов. Хотя ссылки могут быть реализованы как указатели, нет никакой необходимости или гарантии этого.

Часто задаваемые вопросы по С++:

В отличие от указателя, как только ссылка связанный с объектом, он не может быть "переустановлен" на другой объект. ссылка сама по себе не является объектом (она не имеет идентичности; принимая адрес ссылка дает вам адрес референт; помните: ссылка является его референтом).

Также см. мой ответ здесь для полного списка того, как ссылки отличаются от указателей.

Ссылка - это его референт

Ответ 2

НЕТ. Невозможно получить адрес ссылки.
Это потому, что ссылка не объект, это псевдоним (это означает, что это другое имя для объекта).

int  x = 5;
int& y = x;

std::cout << &x << " : " << &y << "\n";

Откроется тот же адрес. Это потому, что "y" - это просто другое имя (псевдоним) для объекта "x".

Ответ 3

Стандарт ISO говорит, что это лучше всего:

Не должно быть ссылок на ссылки, нет массивов ссылок и ссылок на ссылки.

Мне не нравится логика, которую многие люди используют здесь, что вы не можете это сделать, потому что ссылка не "гарантирована как бы просто указатель где-то в любом случае". Так же, как int x может быть только регистром процессора без адреса, но волшебным образом становится ячейкой памяти, когда используется & x, возможно, компилятор сможет разрешить то, что вы хотите.

В прошлом многие компиляторы разрешали именно то, о чем вы просите, например

int x, y;
int &r = x;
&r = &y; // use address as an lvalue; assign a new referent

Я только что проверил и GCC скомпилирует его, но с сильно сформулированным предупреждением, и результирующая программа будет нарушена.

Ответ 4

Нет.

Как говорит Бьярне Страуструп в TС++ PL, ссылку можно рассматривать как просто другое имя для существующей сущности (объекта или функции). Хотя это не всегда самое точное описание лежащего в основе низкоуровневого механизма, реализующего ссылки, это очень хорошее описание концепции, которую ссылки предназначены для реализации на уровне языка. Неудивительно, что язык не дает никаких средств для получения адреса ссылки.

На уровне языка ссылка не гарантируется, что она занимает место в хранилище, и поэтому в общем случае у нее нет адреса.

Ответ 5

Из другого экземпляра этого же вопроса: $8.3.2/3 - "Не указано, нужна ли ссылка для хранения (3.7).".

Таким образом, стандарт С++ позволяет компилятору/разработчику времени исполнения выбирать, будет ли ссылка находиться в отдельной ячейке памяти. Однако учтите, что если он находится в отдельной ячейке памяти, вы не можете найти его адрес стандартным образом. Так что не делайте этого.

Если вы берете адрес ссылки, по определению в стандарте С++, вы получите адрес того, на что он ссылается, а не адрес ссылки, если на самом деле эта ссылка существует даже в качестве отдельного объекта в среда выполнения или нет.

Ответ 6

Просто используйте '&' оператор. например:

int x = 3;
int &y = x;
cout<<&y<<endl;

Это вернет адрес x, так как y является не более чем адресом x.

Ответ 7

Не надежно, поскольку ссылки не обязательно должны иметь уникальное местоположение в адресной памяти.

Ответ 8

Не сам по себе. Если вы хотите его "адрес", запишите его в структуру или класс. Даже тогда это не обязательно гарантирует вас в непосредственной близости от того, что вы, вероятно, хотите сделать, используя указатель. Если вы хотите получить доказательство, sizeof ссылки будет соответствовать типу референта. Попробуйте с помощью char и посмотрите.

Ответ 9

Это возможно, но не строго с использованием С++. Поскольку эта ссылка передается как параметр функции, ее значение будет храниться в стеке или в регистре. Это зависит от аппаратной архитектуры. Доступ к этим значениям потребует встроенной сборки. Обратитесь к справочному руководству для процессора, который вы используете, для определения поведения стека и адресов регистра. Коррупция стека или регистров может очень легко вызвать BSOD, потерю данных или даже постоянный ущерб вашей системе. Будьте предельно осторожны.

Ответ 10

//YES reference varies
//but a little trick in the compiler

    int i = 333;
    int j = 444;
    int &ref = i;                   //ref=i value
    int* p = nullptr;


    printf("ref=%d\n", ref);        //333  i value

    *(&p + 3) = &j;                 //&ref=j

    printf("ref=%d\n", ref);        //444  j value