程序员通过 C的内存管理系统指定变量的作用域和生命期,实现对程序的控制。合理使用内存储存数据是设计程序的一个要点。
一.存储类别
硬件方面来看:被储存的每个值都占用一定的物理内存,C 语言把这样的一块内存称为对象(object)
。对象可以储存一个或多个值。一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相应的大小(面向对象编程中的对象指的是类对象,其定义包括数据和允许对数据进行的操作,C不是面向对象编程语言)。
软件方面来看:程序需要一种方法访问对象。这可以通过声明变量来完成。
以下面的例子作为分析:
1 | int entity = 3; |
该声明创建了一个名为entity
的标识符(identifier)
。标识符是一个名称,在这种情况下,标识符可以用来指定(designate)特定对象的内容。标识符遵循变量的命名规则。在该例中,标识符entity
即是软件(即C程序)指定硬件内存中的对象的方式。该声明还提供了储存在对象中的值。
但是变量名不是指定对象的唯一途径。以下面的例子作为分析:
1 | int * pt = &entity; |
第1行声明中,pt
是一个标识符,它指定了一个储存地址的对象。但是,表达式pt
不是标识符,因为它不是一个名称。然而,它确实指定了一个对象,在这种情况下,它与 entity
指定的对象相同。一般而言,那些指定对象的表达式被称为左值。所以,entity
既是标识符也是左值;*pt
既是表达式也是左值。按照这个思路,ranks + 2 * entity
既不是标识符(不是名称),也不是左值(它不指定内存位置上的内容)。但是表达式*(ranks + 2 * entity)
是一个左值,因为它的确指定了特定内存位置的值,即ranks数组的第7个元素。顺带一提,ranks的声明创建了一个可容纳10个int类型元素的对象,该数组的每个元素也是一个对象。