首页 > 解决方案 > 在 C++ 中,文字 3 和取消引用值为 3 的变量的结果有什么区别?

问题描述

我们知道,如果我有一个变量int a{3},我可以a通过&a. 我可以得到地址&a的指向值*&a,它返回整数3。所以现在我们已经得到了 number 3,我们不能做类似&3获取文字地址的事情,因为这会产生错误。但问题是我们可以成功地使用类似的东西*&*&a来取回价值3。正如我所说,*&a已经返回一个数字3,你不能继续它的链。为什么它在写作时有效*&*&a

标签: c++pointersdereference

解决方案


在机器代码(或汇编程序)级别上使用文字和使用变量之间存在显着差异:

通常,文字可以直接用机器代码编码,而如果涉及到另一个变量,则可能需要先从内存中加载另一个变量的值。

实际上,您的变体int b = *&a;非常接近纯加载/存储架构(缺少任何类型的间接寻址)需要做的事情(假设两个变量都位于内存中, 0xadda 是 variable 的地址, 0xdaad 是 variable 的地址ab

MOV Rx, ADDA; // move address of a into some register
LD  Ry, Rx;   // load value at address in register into a second one
              // (maybe there's a direct addressing mode, then both operations
              // could be a single one)
MOV Rx, DAAD;
ST  Rx, Ry;

相比之下,int b = 3;在同一台机器上要简单一些:

MOV Rx, DAAD;
MOV Ry, 3;    // 3 directly encoded in bit pattern
ST  Rx, Ry;

好的,也许您有一些适当的寻址模式,int b = a; 可以在一条指令中编码:

MOV #DAAD, #ADDA // # indicating indirect access via address

与使用文字相比,您仍然无法讨论是否需要额外的内存访问......

也许对您来说更有趣:您希望如何以某种机器代码命令(&3部分)的某种位模式“神秘地”编码某个值的地址?


推荐阅读