assembly 在C中当x=9时;'compiled是否将'='左边的左值替换为' x '的地址?如果是这样,为什么'&x=9 '是非法的?[duplicate]

d6kp6zgx  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(119)

此问题在此处已有答案

Why are lvalues converted to values in certain places and not others? [duplicate](2个答案)
四个月前关门了。
我是一个C语言的导师和开发人员,我试图加深我对编译过程中发生的事情的理解。
编译后不再有变量名,只有地址
我假设=运算符的左操作数必须是一个ADDRESS!
按照这个逻辑,可以安全地假设x=9的汇编命令如下所示:

  • 将文字9放入x的地址 *

所以,左值x被替换为它自己的地址,这难道不安全吗?
如果是这样的话-为什么不可能直接给予地址这样:
&x=9
在我看来,这将导致相同的程序集命令。
毕竟,左侧的左值将被计算为它的地址,并且该地址将作为操作数发送给=运算符

v9tzhpje

v9tzhpje1#

变量只是一个内存块。假设整数是4个字节长。

int x;

/* ... */

x = 9;

简化:x必须存储在内存中的某个位置。内存单元通过它们的地址来标识。编译器和链接器将人类可读的符号x转换为内存中某些内存单元的地址。机器代码指令写入一些值(在我们的例子中为4个字节)来表示数字9。在大多数现代实现中,它将是9,0,0,0
在真实的生活中,它可能会更复杂,因为编译器可以将其保存在寄存器中或完全优化。
如果是这样的话-为什么不可能直接给予地址这样:&x=9
&x是对对象x的引用。由于它是内存中的固定位置(不能更改),因此不能对其赋值。但当然可以解引用(访问)此位置

*&x = 9;

引用(地址)可以分配给指针

int x = 0;
int *pointer = &x;

相关问题