首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中,当`x=9;`编译时,`=`左侧的lvalue是否替换为‘x’的地址?如果是的话,为什么`&x=9`是非法的?

在C中,当`x=9;`编译时,`=`左侧的lvalue是否替换为‘x’的地址?如果是的话,为什么`&x=9`是非法的?
EN

Stack Overflow用户
提问于 2022-07-25 13:20:11
回答 1查看 80关注 0票数 -2

我是一个C导师和开发人员,试图加深我对编译过程中所发生的事情的理解。我遇到了C教程,它说

编译后的

没有更多的变量名,只有地址

我假设=运算符的左操作数必须是一个地址!

按照这个逻辑,可以安全地假设x=9的程序集命令如下:

将文字9放入x地址

那么,用自己的地址替换lvalue x不是很安全吗?

如果是的话-为什么不能直接给出地址:

&x=9

在我看来,这将导致相同的程序集命令。

毕竟,左边的这个l值将被计算到它的地址,这个地址将作为一个操作数发送给=操作符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 13:44:48

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

代码语言:javascript
复制
int x;

/* ... */

x = 9;

简化:x必须存储在内存中的某个地方。存储单元是通过它们的地址来识别的。编译器和链接器将人类可读的符号x转换为内存中某些内存单元的地址。机器代码指令编写一些值(在我们的例子中是4个字节),表示数字9。在大多数现代实现中,它将是9,0,0,0

在现实生活中,它可能更复杂,因为编译器可以将其保存在寄存器中或完全优化它。

如果是的话,为什么不能直接给出地址,如:

:&x=9

&x是对对象x的引用。您不能分配它,因为它是内存中的一个固定位置(您不能更改它)。但是你当然可以取消对这个位置的访问。

代码语言:javascript
复制
*&x = 9;

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

代码语言:javascript
复制
int x = 0;
int *pointer = &x;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73109927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档