此问题在此处已有答案:
Why are lvalues converted to values in certain places and not others? [duplicate](2个答案)
四个月前关门了。
我是一个C语言的导师和开发人员,我试图加深我对编译过程中发生的事情的理解。
编译后不再有变量名,只有地址
我假设=
运算符的左操作数必须是一个ADDRESS!
按照这个逻辑,可以安全地假设x=9
的汇编命令如下所示:
- 将文字
9
放入x
的地址 *
所以,左值x
被替换为它自己的地址,这难道不安全吗?
如果是这样的话-为什么不可能直接给予地址这样:&x=9
在我看来,这将导致相同的程序集命令。
毕竟,左侧的左值将被计算为它的地址,并且该地址将作为操作数发送给=
运算符
1条答案
按热度按时间v9tzhpje1#
变量只是一个内存块。假设整数是4个字节长。
简化:
x
必须存储在内存中的某个位置。内存单元通过它们的地址来标识。编译器和链接器将人类可读的符号x
转换为内存中某些内存单元的地址。机器代码指令写入一些值(在我们的例子中为4个字节)来表示数字9。在大多数现代实现中,它将是9,0,0,0
。在真实的生活中,它可能会更复杂,因为编译器可以将其保存在寄存器中或完全优化。
如果是这样的话-为什么不可能直接给予地址这样:&x=9
&x
是对对象x
的引用。由于它是内存中的固定位置(不能更改),因此不能对其赋值。但当然可以解引用(访问)此位置引用(地址)可以分配给指针。