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