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),块作用域变量的可见范围是从定义处到包含该定义的块的末尾

虽然函数的形式参数声明在函数的左花括号之前,但是它们也具有块作用域,属于函数体这个块

使用的局部变量(包括函数的形式参数)都具有块作用域

上一篇:nuxt 运行项目后 中总是报错


下一篇:python 函数式编程 高阶函数 装饰器