我正在学习指针和参考资料,我的问题涉及this解释,特别是以下部分:
这表明声明int& ri = i
创建了一个新的内存单元格,其值为&i
并存在于未知的内存位置。
为了测试这个理论,我写了一个简单的案例,结果如下所示:
我对r
和i
具有相同的内存地址这一事实感到困惑,这似乎与读数相矛盾。结果表明,int& ri = i
松散地意味着“为内存单元i
创建别名并将其称为r
”,这样两者都指向完全相同的单元格。
文件是否正确,或者我遗漏了什么?
答案 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的另一个名称。无论对它们中的任何一个做出什么改变都会相互反映。