存储类别、链接和内存管理

存储类别

即 stroage class,C语言提供了多种不同的模型和存储类别在内存中存储数据。

从硬件方面看, 被存储的每个值都占有一定的物理内存,C语言称之为对象(object)。

与面向对象编程中的对象不同,面向对象编程的对象指的是“类对象”。

1
int entity = 3;

该声明创造了一个名为 entity 的 标识符(identifier)。标识符可以用来 指定(desingate)特定对象的内容,且须遵循变量的命名规则。

标识符即 软件(C语言)指定硬件内存中的对象(内存区块)的方式。

同时,那些指定对象的表达式被称为 左值

左值可以被理解为是 “有具体存储位置的 对象 ”,区别于 “仅有值而没有具体存储位置” 的数据。

另,左值中也有可修改的 普通左值, 和不能支持修改的 常量左值

“左”(left)的原意是指可以放在赋值符号“=”的左边,但其实也表示能作为&和++等操作符的操作数(B语言中已经如此)。而且,现代C/C++中的含义已经不局限于此。lvalue的 l 被重新解释为location。这也对应于ISO C11/ISO C++11的 内存位置(memory location)。

——百度百科

从一个左值中必定可以解析出对应对象的地址,除非该对象是位字段(bit-field)或者被声明为寄存器存储类。生成左值的运算符包括下标运算符(subscript operator)[]和间接运算符(indirection operator)*,如下表所示(如果 array 已被声明为数组,而 ptr 被声明为指针变量)。

表达式 是左值吗
array[1] 是;一个数组元素是一个具有位置的对象
&array[1] 否;此对象的位置,并非一个具有位置的对象
ptr 是;此指针变量是一个具有位詈的对象
*ptr 是;指针所指的地方是一个具有位置的对象
ptr+1 否;此加法产生一个新的地址值,但不是一个对象
*ptr+l 否;此加法产生一个新的算术值,但不是一个对象

参考

  1. 《C Primer Plus》, Stephen Prata
  2. 左值
  3. C语言左值与右值详解