我正在学习指针和引用,我的问题是指这个解释,特别是以下部分:
这表明该声明int& ri = i
创建了一个新的存储单元,该存储单元的值为&i
并存在于未知的存储位置中。
为了验证这个理论,我写了一个简单的案例,结果如下所示:
我对具有相同内存地址的事实感到困惑r
,i
这似乎与读数相矛盾。结果表明,int& ri = i
松散的意思是“为存储单元创建一个别名i
并调用它r
”,这样两者都指的是完全相同的单元。
文件是否正确,还是我遗漏了什么?
由于r
是对 的引用i
,因此编译器会将所有操作r
转换为对 的操作i
。这样做&r
,给你的内存地址i
在。
(请注意,与指针不同,引用具有在声明后不被“重新引用”的属性——它们总是引用相同的东西——所以没有办法编写对“引用”进行操作的操作,而不是“对所引用的内容”进行操作')
C++11 §8.3.2/4
It is unspecified whether or not a reference requires storage.
通过声明左值引用 ( T&
),您可以为现有内存位置创建概念别名。编译器可以使用“好像”规则来按自己的意愿处理它。它可能会创建一个指针,它可能只是直接访问内存,但你不应该关心它将如何实现。
您正在阅读的 PDF 描述了左值引用的可能实现,但在一般情况下是错误的。左值引用的一个好的思维模型将为同一个变量赋予第二个名称,这样您就可以通过几个不同的名称(和范围)访问相同的数据。
此外,您不能获取右值的地址或创建指向右值的指针,但可以创建对它的右值引用。
该文档说“pi 和 ri 都包含指向 i 位置的地址,但区别在于引用和指针在表达式中使用时的外观。”,这是真的。
您写的“[reference] 松散地表示“为内存单元 i 创建别名并将其称为 r”,这样两者都引用完全相同的单元格”,这也是正确的。
你可能误解了文件,你是对的,文件也是。
我认为这篇 SO 帖子可能对您有所帮助。引用那里给出的答案:
引用是隐式指针。基本上,您可以更改引用指向的值,但不能更改引用以指向其他内容。
我不确定您所说的“记忆细胞”是什么意思。查看汇编中的代码可能会帮助您理解正在发生的较低级别的语义。由于您似乎使用的是 Windows,如果您足够好奇,我建议您在 ollyDbg 中运行您的应用程序。
我的看法(我可能是非常错误的)是编译器将 pi 视为可变指针,而 ri 是不可变指针。
r 是独立参考(概念)或只是 i 的另一个名称。对它们中的任何一个所做的任何更改都会相互反映。