【问题标题】:What is a variable (more explicit explanation) (C)?什么是变量(更明确的解释)(C)?
【发布时间】:2020-11-03 09:47:54
【问题描述】:

我试图围绕变量的概念展开思考。

很明显,变量的工作原理是隐含的。然而,我试图解释我的隐性知识并遇到了一些困难。这是我想出的:

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

这有什么问题或不准确(我敢肯定)?怎么解释比较好?

【问题讨论】:

  • 变量也有对齐方式。如果它们存储在内存中,它们将有一个地址,但并非所有变量都存储在内存中(有些存储在寄存器中)。例如,使用register 存储类声明的变量可能没有内存地址。类似地,即使没有 register 说明符,优化函数中的变量也可以分配给寄存器。
  • 大小取决于编译器实现(不是硬件)。大多数实现都遵循硬件的“自然大小”。不难想象一个编译器使用不同的int 大小和选项--intsize=16--intsize=48 ...
  • 我会说变量是一个完全由标识符表示的对象,尽管这种描述也适用于函数的形式参数。
  • @IanAbbott:这很好,在 C 中,参数是变量:您可以读取和写入它们,并将它们的地址当作“普通”变量,例如在函数内部定义的变量。它们只是使用调用者参数的值初始化的自动对象。
  • @EricPostpischil 我想这是正确的,并且很有用。我在想 C 标准可能会以某种方式区分参数和变量,但它没有在任何地方定义术语“变量”。

标签: c pointers variables


【解决方案1】:

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

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

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

我们通常认为一个对象具有某种类型。类型决定了存储在对象中的值的含义——当解释为 float 时,相同的位可能意味着 3.75,但在解释为 int 时可能意味着 1,081,081,856。 C 标准定义了类型如何表示的一些属性(例如某种形式的二进制用于整数),并要求 C 实现定义其余部分(位字段的某些方面除外)。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2014-12-02
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多