有没有办法找到参考的地址?

San*_*eep 64 c++ reference

有没有办法找到参考的地址?

使其更具体:变量本身的地址,而不是它初始化的变量的地址.

Bri*_*ndy 64

引用没有自己的地址.虽然引用可以实现为指针,但是不需要或保证这一点.

C++ FAQ最好说:

与指针不同,一旦引用绑定到对象,它就不能"重新"到另一个对象.引用本身不是一个对象(它没有标识;获取引用的地址会给出引用的地址;记住:引用是它的引用).

另请在此处查看我的答案,以获取有关参考与指针不同完整列表.

参考是它的指示物

  • 你是对的.但有时使用术语别名而不是指称是更容易的. (10认同)

Mar*_*ork 35

.无法获取引用的地址.
这是因为引用不是对象,它是别名(这意味着它是对象的另一个名称).

int  x = 5;
int& y = x;

std::cout << &x << " : " << &y << "\n";
Run Code Online (Sandbox Code Playgroud)

这将打印出相同的地址.
这是因为'y'只是对象'x'的另一个名称(别名).


Pot*_*ter 22

ISO标准说得最好:

不应引用引用,不引用引用数组,也不引用引用指针.

我不喜欢很多人在这里使用的逻辑,你不能这样做,因为引用不是"保证只是某个地方的指针".正如int x可能只是一个没有地址的处理器寄存器,但在& x使用时神奇地成为存储器位置,编译器仍然可以允许你想要的东西.

在过去,许多编译器确实允许你所要求的,例如

int x, y;
int &r = x;
&r = &y; // use address as an lvalue; assign a new referent
Run Code Online (Sandbox Code Playgroud)

我刚检查过,GCC会编译它,但是有一个措辞强烈的警告,结果程序坏了.


AnT*_*AnT 12

没有.

正如Bjarne Stroustrup在TC++ PL中所说,引用可以被认为是现有实体(对象或函数)的另一个名称.虽然这并不总是对实现引用的底层低级机制的最精确描述,但它是对引用在语言级别实现的概念的非常好的描述.毫不奇怪,该语言无法获得引用本身的地址.

在语言级别,不保证引用占用存储位置,因此通常情况下它没有地址.


小智 9

从同一个问题的另一个例子:$ 8.3.2/3 - "未指明引用是否需要存储(3.7).".

因此,C++标准允许编译器/运行时实现者选择引用是否位于单独的内存位置.但请注意,如果它确实存在于单独的内存位置,则无法以符合标准的方式找到其地址.所以不要这样做.

如果您按照C++标准的定义获取引用的地址,您将获得它所引用的地址,而不是引用的地址,如果事实上该引用甚至作为运行时环境中的单独实体存在或不.


Jes*_*ond 7

只需使用'&'运算符即可.例如:

int x = 3;
int &y = x;
cout<<&y<<endl;
Run Code Online (Sandbox Code Playgroud)

这将返回x的地址,因为y只不过是x的地址.

  • 哦,参考只是对象的别名(替代名称).它没有自己的存储单元. (5认同)
  • @Sandeep:"指针有自己的地址".正确.那是因为指针是一个***变量,它保存了它所指向的变量的地址.在引用的情况下,*没有单独的变量*.引用只是被引用变量的另一个名称.获取引用的地址将只返回被引用变量的地址. (5认同)
  • 我认为Sandeep意味着参考本身的*地址* (2认同)