引用是在内存中创建新位置,还是在现有单元格中创建别名?

时间:2013-06-13 05:55:03

标签: c++ pointers reference

我正在学习指针和参考资料,我的问题涉及this解释,特别是以下部分:

这表明声明int& ri = i创建了一个新的内存单元格,其值为&i并存在于未知的内存位置。

为了测试这个理论,我写了一个简单的案例,结果如下所示:

enter image description here

我对ri具有相同的内存地址这一事实感到困惑,这似乎与读数相矛盾。结果表明,int& ri = i松散地意味着“为内存单元i创建别名并将其称为r”,这样两者都指向完全相同的单元格。

文件是否正确,或者我遗漏了什么?

5 个答案:

答案 0 :(得分:10)

由于r是对i的引用,因此编译器会将r上的所有操作转换为i上的操作。所以做&r,会给你内存地址i

(注意,与指针不同,引用具有在声明之后不被“重新引用”的属性 - 它们总是引用相同的东西 - 所以没有办法编写操作'对引用'的操作,而不是'on'什么被引用')

答案 1 :(得分:8)

C ++11§8.3.2/ 4

It is unspecified whether or not a reference requires storage.

通过声明左值引用(T&),可以为现有内存位置创建概念别名。编译器可以使用“似乎”规则来按照自己的意愿对其进行处理。它可能会创建一个指针,它可能只是直接访问内存,但你不应该关心它将如何实现。

您正在阅读的PDF描述了左值引用的可能实现,但在一般情况下是错误的。左值引用的良好思维模型将为同一变量赋予第二个名称,因此您可以通过几个不同的名称(和范围)访问相同的数据。

此外,您不能获取rvalue的地址或创建指向rvalue的指针,但您可以创建一个rvalue引用。

答案 2 :(得分:2)

该文件说“pi和ri都包含指向i位置的地址,但区别在于 在表达式中使用引用和指针之间的外观。“,这是真的。

你写的“[reference]松散地意味着”为内存单元i创建一个别名并将其命名为r“,这样两者都指向完全相同的单元格”这也是真的。

您可能误解了该文档,您是对的,文档也是如此。

答案 3 :(得分:0)

我认为this SO post可能会对您有所帮助。在那里引用答案:

  

引用是一个隐式指针。基本上你可以改变价值   引用指向但您无法更改指向的引用   别的什么。

我不确定“存储单元”是什么意思。查看汇编代码可能有助于您了解正在发生的低级语义。由于您似乎正在使用Windows,如果您有足够的好意,我建议您在ollyDbg中运行您的应用程序。

我的看法(我可能非常错误)是编译器将pi视为可变指针,而ri是不可变指针。

答案 4 :(得分:0)

r是独立引用(概念)或i的另一个名称。无论对它们中的任何一个做出什么改变都会相互反映。