存储类别、链接和内存管理
存储类别
即 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 | 否;此加法产生一个新的算术值,但不是一个对象 |
参考
- 《C Primer Plus》, Stephen Prata
- 左值
- C语言左值与右值详解