C Primer Plus学习笔记(十一)- 存储类别、链接和内存管理
存储类别
从硬件方面来看,被储存的每个值都占用一定的物理内存,C 语言把这样的一块内存称为对象(object)
对象可以储存一个或多个值。一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相应的大小
int entity = 3;
该声明创建了一个名为 entity 的标识符(identifier)。标识符是一个名称,在这种情况下,标识符可以用来指定(designate)特定对象的内容
标识符 entity 即是软件(即 C 程序)指定硬件内存中的对象的方式。该声明还提供了储存在对象中的值
变量名不是指定对象的唯一途径
int rank[10];
rank 的声明创建了一个可容纳 10 个 int 类型元素的对象,该数组的每个元素也是一个对象
const char * pc = "Hello World";
程序根据该声明把相应的字符串字面量储存在内存中,内含这些字符值的字符串字面量就是一个对象。由于字符串字面量中的每个字符都能被单独访问,所以每个字符也是一个对象
该声明还创建了一个标识符为 pc 的对象,储存着字符串的地址
由于可以设置 pc 重新指向其他字符串,所以标识符 pc 是一个可修改的左值
const 只能保证被 pc 指向的字符串内容不被修改,但是无法保证 pc 不指向别的字符串
由于 *pc 指定了储存 'B' 字符的数据对象,所以 *pc 是一个左值,但不是一个可修改的左值
字符串字面量本身指定了储存字符串的对象,所以它也是一个左值,但不是可修改的左值
可以用存储期(storage duration)描述对象
存储期是指对象在内存中保留了多长时间
标识符用于访问对象,可以用作用域(scope)和链接(linkage)描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它
不同的存储类别具有不同的存储期、作用域和链接
标识符可以在源代码的多文件中共享、可用于特定文件的任意函数中、可仅限于特定函数中使用,甚至只在函数中的某部分使用
对象可存在于程序的执行期,也可以仅存在于它所在函数的执行期
对于并发编程,对象可以在特定线程的执行期存在
可以通过函数调用的方式显示分配和释放内存
作用域
作用域描述程序中可访问标识符的区域
一个 C 变量的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域
块是用一对花括号括起来的代码区域
例如,整个函数体是一个块,函数中的任意复合语句也是一个块
定义在块中的变量具有块作用域(block scope),块作用域变量的可见范围是从定义处到包含该定义的块的末尾
虽然函数的形式参数声明在函数的左花括号之前,但是它们也具有块作用域,属于函数体这个块
使用的局部变量(包括函数的形式参数)都具有块作用域