2010-08-16 133 views
3

可能重复:
Is there any way to find the address of a reference?内存地址

当我们打印实际变量和参考变量的地址,它显示了相同的地址,为什么?

+0

如果你不把它称为“参考变量”,它可能不那么令人困惑。引用不是一个变量,并且没有自己的地址。 – 2010-08-16 15:34:53

+2

@Mike:命名的引用将被称为*变量*在C++ 0x中讨论[这里](http://stackoverflow.com/questions/2908834/why-was-the-definition-of-a-variable -changed-在最最新-C0X-草案)。 – fredoverflow 2010-08-16 15:52:35

回答

6

因为它们都指向相同的内存位置。这基本上是通过引用是关于。不是传递(复制)变量的实际值,而是因为性能(和内存使用)原因而发送它的地址。

引用行为有点像指针,但它们更安全,不同于指针。欲了解更多信息,请看this page

+0

与你一起,但我的老师说,假设x作为变量a的别名,那么x必须有一些内存地址,如01010,也可以有0101,所以两者如何可以相同 – gurwinder 2010-08-16 15:39:27

+0

在内部,引用实现为指针 - 所以是的,参考文献在别的地方。但在语言规则中,x **是** a。我认为获取引用的地址在引擎盖下相当于获取指针的值(即指针存储/指向的地址)。 – delnan 2010-08-16 15:48:23

+2

@gurwinder:你的老师不知道他们在说什么。告诉他他正在承担一个实现细节,而C++是一种语言,而不是实现。所有这些都是标准所要求的,你不能保证参考*甚至有存储*。 (参见§8.3.2/ 3:“没有指定参考是否需要存储”)所以,通过说“它必须存储在某个地方”,你的老师是无可辩驳的错误;它可能不会。 @delnan:它可能也可能不是,标准不需要任何东西。 – GManNickG 2010-08-16 19:13:29

3

因为它是参考。这意味着它引用实际变量。

int i = ...; 
int& ri = i; 

在这个例子中,是rii的别名。

10

引用是另一个变量的别名 - 它只是分配给引用的另一个名称。

编译器可能会使用指针机制实现它在幕后,但如果有足够的人知道的事情是混淆和参考的寿命,编译器可以与

5

这也是一个重要的预留分配知道:

$ 8.3.2/3 - “没有指定参考是否需要存储(3.7)”。

+0

我不明白这个说法吗?这是什么意思 ? – 2010-08-20 09:20:10

+3

@StephaneRolland例如,它意味着如果编译器发现被引用变量的整个生命期都在寄存器中,它永远不会在被寻址的内存中。 – 2014-02-12 21:41:20