C++ 在C++;,什么';文字3和取消引用值为3的变量的结果之间的差异是多少?

C++ 在C++;,什么';文字3和取消引用值为3的变量的结果之间的差异是多少?,c++,pointers,dereference,C++,Pointers,Dereference,我们知道如果我有一个变量inta{3},我可以通过&a获得a的地址。我可以通过*&a获得地址&a的指向值,它返回整数3。所以现在我们已经得到了数字3,我们不能像&3那样获得文本的地址,因为这会产生错误。但问题是,我们可以成功地使用类似*&*&a的方法来获取3值。正如我所说的,*&a已经返回了一个数字3,您不能在上面继续链。为什么它在以*&*&a的形式编写时有效?在机器代码(或汇编程序)级别上使用文本和使用变量之间存在显著差异: 通常,文本可以直接在机器代码中编码,而如果涉及到另一个变量,则可能需

我们知道如果我有一个变量
inta{3}
,我可以通过
&a
获得
a
的地址。我可以通过
*&a
获得地址
&a
的指向值,它返回整数
3
。所以现在我们已经得到了数字
3
,我们不能像
&3
那样获得文本的地址,因为这会产生错误。但问题是,我们可以成功地使用类似
*&*&a
的方法来获取
3
值。正如我所说的,
*&a
已经返回了一个数字
3
,您不能在上面继续链。为什么它在以
*&*&a
的形式编写时有效?

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

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

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

相比之下,
intb=3在同一台机器上稍微简单一些:

MOV Rx, DAAD;
MOV Ry, 3;    // 3 directly encoded in bit pattern
ST  Rx, Ry;
好的,也许你有一些合适的寻址模式,比如
intb=a可以在一条指令中编码:

MOV #DAAD, #ADDA // # indicating indirect access via address
但是,您仍然无法讨论,与使用文本相比,还需要额外的内存访问


也许对你来说更有趣的是:你想如何得到某个值的地址被“神秘地”编码在某个机器代码命令的某个位模式中(
&3
部分)?

请看你把
&
弄糊涂了,因为它表示操作员地址的引用。
3
是一个“prvalue”而产生一个“左值”
MOV #DAAD, #ADDA // # indicating indirect access via address