一、存储类别
1.作用域:描述程序中可访问标识符的区域
1) 一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域
2) 块是用一对花括号括起来的代码区域(例:整个函数体、函数体的任意复合语句)
3) 定义在块中的变量具有块作用域,块作用域变量的可见范围是从定义处到包含该定义块的末尾
4) 函数作用域仅用于goto语句的标签,一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数
5) 函数原型作用域的范围是从形参定义处到原型声明结束(只关心类型,不关心形参名(变长数组中形参名才有用))
6) 全局变量:变量的定义在函数的外面,具有文件作用域,作用范围从定义处到该定义所在文件的末尾均可见
例: #include<stdio.h>
int sum = 0; ///全局变量:该变量具有文件作用域(func()和main()都可使用)
void func();
int main()
{ ...}
void func()
{ ... }
7) C预处理实际上是用包含的头文件内容替换#include指令
8) 翻译单元: 编译器源代码文件(.c扩展名)和所有的头文件(.h扩展名)都看成是一个包含信息的单独文件(翻译单元)
9) 描述一个具有文件作用域的变量时,它的实际可见范围是整个翻译单元
10) 如果程序由多个源代码文件组成,那么该程序也将由多个翻译单元组成
2.链接
1) C变量有三种链接属性: 外部链接、内部链接或无链接
2) 具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量(块、函数原型或函数私有)
3) 具有文件作用域的变量可以是外部链接或内部链接
4) 外部链接变量可以在多文件程序中使用,内部链接变量只能在一个翻译单元中使用
5) 内部链接的文件作用域简称问文件作用域;外部连接的文件作用域简称全局作用域
例: int num = 5; //文件作用域,外部链接变量
static int sum = 3 //文件作用域,内部链接变量
int main()
{ ... }
3.存储期
1) C对象有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期
2) 静态存储期: 在程序的执行期间一直存在
文件作用域变量具有静态存储期
无论是内部链接还是外部链接,所有的文件作用域变量都具有静态存储期
块作用域的变量也能具有静态存储期: 要把声明在块中的变量前面加上关键字static
3) 线程存储期: 用于并发设计,程序执行可被分为多个线程
具有线程存储期的对象,从被声明时到线程结束一直存在
以关键字_Thread_local声明一个对象时,每个线程都获得该变量的私有备份
4) 自动存储期:块作用域的变量通常都具有自动存储期
当程序进入定义这些变量的块时,为这些变量分配内存;当退出这个块时,释放刚才为变量分配的内存
变长数组的存储期从声明处到块的结尾,而不是从块的开始处到块的结尾
例: 局部static变量
int func(void)
{
static int num = 0
}
// 变量num储存在静态内存中,它从程序被载入到程序结束期间都存在
// num的作用域定义在func()函数块中,只有在执行该函数时,程序才能使用num访问它所指的对象
// 该函数可以给其他函数提供该存储区的地址以便间接访问该对象(通过指针形参或返回值)
存储类别 | 存储期 | 作用域 | 链接 | 声明方式 |
---|---|---|---|---|
自动 | 自动 | 块 | 无 | 块内 |
寄存器</ |