9

我正在学习指针和引用,我的问题是指这个解释,特别是以下部分:

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

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

在此处输入图像描述

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

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

4

5 回答 5

11

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

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

于 2013-06-13T05:58:25.960 回答
9

C++11 §8.3.2/4

It is unspecified whether or not a reference requires storage.

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

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

此外,您不能获取右值的地址或创建指向右值的指针,但可以创建对它的右值引用。

于 2013-06-13T06:56:36.897 回答
2

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

您写的“[reference] 松散地表示“为内存单元 i 创建别名并将其称为 r”,这样两者都引用完全相同的单元格”,这也是正确的。

你可能误解了文件,你是对的,文件也是。

于 2013-06-13T05:59:40.433 回答
0

我认为这篇 SO 帖子可能对您有所帮助。引用那里给出的答案:

引用是隐式指针。基本上,您可以更改引用指向的值,但不能更改引用以指向其他内容。

我不确定您所说的“记忆细胞”是什么意思。查看汇编中的代码可能会帮助您理解正在发生的较低级别的语义。由于您似乎使用的是 Windows,如果您足够好奇,我建议您在 ollyDbg 中运行您的应用程序。

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

于 2013-06-13T06:03:55.470 回答
0

r 是独立参考(概念)或只是 i 的另一个名称。对它们中的任何一个所做的任何更改都会相互反映。

于 2013-06-13T06:28:18.677 回答