C Primer Plus
第五版
第十二章 存储类、链接和内存管理
作用域:描述了一个程序可以访问的标示符的一个或多个区域。
代码块作用域:在代码块中定义的一个变量,函数的形式参量也具有
代码块作用域。
C99把代码块扩大到 for while do while 循环 和if语句控制的代
码块{};
文件作用域:一个在所有函数之外定义的变量。文件作用域也称全局
变量。
链接分:外部链接,内部链接,空连接。
具有代码块作用域或者函数原型作用域的变量有 空连接,意味着它
是由其定义的代码块或函数所私有。
具有文件作用域的变量可能有内部链接或外部链接,一个具有外部链
接的变量可以再一个多文件的程序中的任何地方中使用。
一个具有内部链接的变量 可以再一个文件的任何地方使用。
static 定义内部链接变量;
C语言 变量有两种存储方式:静态存储时期和自动存储时期。
变量具有静态存储时期:他在程序运行期间将一直存在。具有文件作
用域的变量和static定义的变量具有静态存储时期。
C语言通过使用 作用域 链接 存储时期 三种方式定义5种存储类型。
:自动 寄存器 具有代码块作用域的静态,具有文件作用域的静态,
具有内部链接的静态。
自动变量:在代码块或函数头部定义的任意变量都属于自动存储类,
可以使用关键字auto定义的变量 是 自动存储类。
代码块或函数中的局部变量将覆盖全局变量。运行离开代码块时全局
变量从新起作用。
寄存器变量:可以使用 register 定义寄存器变量,但此句是一个
请求,并不是一条命令。不一定嫩成功,不能对其使用地址运算符。
代码块内静态变量是通过存储类说明符static定义变量,在代码块中
只赋值一次。 对函数参量不能使用static
外部变量具有外部链接的静态变量 ;外部变量在其他文件中定义,
在本文件中使用要用extern 声明 ,在同一文件可以省略。在代码块
中使用extern 再次声明只是表面函数要用该变量,其实不声明也可
以使用。
外部变量作用域 是从声明位置到程序结束。
一个外部变量只可以进行一次初始化,一定是在变量被定义的时候。
externa char perimes='A';错误 extern 表明其是个外部变量
,但外部变量只能在定义时被初始化。
创建数组有三种方法:
1:声明一个数组,声明时用常量表达式
2:声明一个变长数组,声明时用变量表达式指定数组维数
3:声明一个指针,调用malloc()函数 (动态分配内存)
常用形式 int * ptr=(int *)malloc(n*sizeof(int)); free(ptr)
释放内存。
int *ptr=(int *)calloc(n,sizeof(int));
第一参数:n 所需的内存数量
第二参数:每个单元以字节大小。
自动存储结果是在运行完定义部分之后自动释放。
malloc()创建的数组不必局限于一个函数
静态存储时期存储类变量所需内存数量在编译时以知道,在整个程序
运行期间都是可用的,在程序开始时存在,在程序结束消失。
自动变量在程序进入包含该变量的代码块时产生,在退出这一代码块
时终止。
动态分配内存在调用malloc或相关函数时产生,调用free释放,内
存块可以再一个函数中定义,在另一个函数中释放。如在一个函数中
创建返回一个指针,在另一个函数对其释放。
限定词 可以在一个声明中多次使用 const const const int n=5;
等价于const int n=5;
1、指针 参量声明中使用const
2、指针本身使用还是其指定的值使用
const float *ptr ptr指向一个常量浮点值
float *const ptr 总指向一个地址,指向的值可以改变
const float *const ptr 都不变
float *const ptr 等价于const float * ptr
3、对全局变量使用const
限定词 volatile restrict