在C语言中,变量可以有一个内存地址和一个值。
正如我所理解的,每个函数都有一个地址,还有在那个地址分配的数据。我的问题是这些函数所指向的数据的含义是什么?
最佳答案
你已经得到了(好的)答案,但我认为有些(晦涩的?)关于你的问题,应该指出关于C的事实:
在C语言中,变量可以有一个内存地址和一个值。
实际上,变量的定义属性总是有一个值——如果它是未初始化的,在语义上它仍然有一个值,只有这个值是“未定义的值”,读取“未定义的值”调用未定义的行为。
但是,这很重要,不是C中的每个变量都有地址!有这样一个小的存储分类器,这意味着大多数人没有完全理解它。最普遍也是最错误的解释是,register
意味着变量只能放在寄存器中。问题是:有指令体系结构,其中寄存器不存在,但是C已经被设计成对它们仍然是可行的。register
分类器的真正含义是,不能获取寄存器变量的地址,这意味着您不能创建指向它的指针。
其结果是,一个register
唯一重要的变量是它的值。C编译器生成的代码完全抛弃了它的值所在的“位置”(无论是寄存器、内存位置还是其他完全不同的地方),只要它能够以某种方式忠实地重新创建该值,就完全符合程序文本的语义,这是完全合法的。这也意味着,完全合法的做法是对为了获得最终价值而必须执行的任何操作进行重新计算。这就是为什么对变量应用register
存储限定符可能会导致代码大小突然增加和性能下降的原因。
因此,register
存储限定符不是优化代码的机制,但应被视为编写代码的专用工具,它既不需要时间也不需要大小,但必须在非常特定的严格约束下操作。一个例子是引导加载程序或系统初始化代码,它的任务是首先初始化内存访问,并且只需几个字节(甚至没有可用内存存储)即可操作,但可以重新计算每个步骤所需的值。