微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是变量更明确的解释C?

如何解决什么是变量更明确的解释C?

我试图把头放在变量的概念上。

很显然,隐式清楚了变量是如何工作的。但是,我试图阐明自己的内在知识,但遇到了一些困难。这是我想出的:

变量是一定大小的容器。 大小既取决于变量声明中的数据类型,也取决于硬件(具体是什么?字大小?)。 变量在内存中具有一个地址,该地址存储在该容器的预分配大小内(变量的名称如何连接到其内存地址?)。 在该变量的内存保留位置内,可以存储与声明的数据类型相对应的值。

那是错误的还是不精确的(我敢肯定)?如何更好地解释?

解决方法

在C语言中,变量由两部分组成:标识符对象

标识符是在源代码中用来表示对象的文本字符串。 (标识符也可以表示函数,结构成员和其他内容。)

对象是“执行环境中数据存储的区域,其内容可以表示值”(C 2018 3.1.15 1)。

我们通常认为对象具有某种 type 。类型确定存储在对象中的值的含义-当解释为float时,相同的位可能表示3.75,但是解释为int时,则为1,081,856。 C标准定义了类型表示方式的某些属性(例如,将某种形式的二进制用于整数),并且需要C实现来定义其余类型(位字段的某些方面除外)。

因此,关于如何表示对象的“最终决定权”取决于每个C实现。大多数C实现都受硬件的影响,因为它们旨在在目标系统上有效地工作,但是C实现可以在使用32位字的硬件上提供37位int对象。

之前,我说过我们通常认为对象具有某种类型。当定义对象的标识符时,将为其保留存储空间。该存储量由类型决定。但是,对象值的实际解释取决于用于访问它的表达式。几乎所有时候,我们使用声明的类型访问对象:声明float x;后,我们使用x = 3.75; printf("%g\n",x);,依此类推,在这些表达式中用于访问对象的类型为{{1} },声明的类型为float。但是C是灵活的,它允许我们使用x设置指向存储器的char指针,然后我们可以使用char *p = (char *) &x;,{{1}访问x的字节。 }, 等等。在这种情况下,用于访问对象或其部分的表达式的类型为c[0],因此当使用这些表达式访问对象的表达式时,我们得到的是c[1]值而不是char值。对象。

编译器知道并安排标识符与其存储(内存)之间的连接。定义对象的标识符后,编译器将为其计划存储(取决于编译器的程序优化)。该存储可以在程序的数据部分中,也可以在堆栈部分中或其他地方。编译器知道引用存储的方法。堆栈中的位置可以通过相对于堆栈指针或帧指针的偏移量来引用。数据段中的位置可以用程序加载器相对于存储在特定寄存器中的基址的偏移量来引用。可以通过相对于段开头的偏移量或绝对存储地址来引用位置。无论什么情况,当编译器需要生成访问对象的指令时,它都会生成合适的指令。这可以是在指令本身中包括相对于堆栈指针的偏移量的指令。或者可能是两个或更多指令,将偏移量添加到基址寄存器,然后使用结果访问内存。或者它可能是部分生成的指令,稍后在程序加载器将其调整为具有最终地址时完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。