存储类:
C为变量提供了5种不同的存储类,还有基于指针的第6种存储类。
不同的存储类提供了变量的作用域、链接和存储时期的不同组合。
作用域:描述了程序中可以访问的一个标识符的一个或多个区域。
一个C变量的作用域可以是代码块作用域(code scope)、函数原型作用域(function prototype scope),或者文件作用域(file scope)。
一个代码块是包含在开始花括号和结束花括号之内的一段代码。
在代码块中定义的变量具有代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾,该变量均可见。
另外,函数的形式参数也具有代码块作用域。
C99把代码块的概念扩展到了由for循环、while循环、do while循环或者if语句所控制的代码--即使这些代码没有被花括号括起来。
函数原型作用域适用于函数原型中使用的变量名。其作用域从变量定义处直到原型声明的末尾。如:
int mighty(int mouse, double large);
这说明编译器在处理一个函数原型的参数时,它所关心的只是该参数的类型,在声明中使用说明名字通常是无关紧要的。
但是有一个例外,就是变长数组参量。如果在方括号中使用了变量名,则该变量名必须是在原型中已经声明了的。
一个在所有函数之外定义的变量具有文件作用域。具有文件作用域的变量从它定义处到包含该定义的文件结尾处都是可见的。
文件作用域变量也被称为全局变量(global variable)。
链接:
一个C变量具有下列链接之一:外部链接(external linkage)、内部链接(internal linkage)或空链接(no linkage)。
具有代码块作用域或函数原型作用域的变量有空链接,意味着它们是由其定义所在的代码块或函数原型所私有的。
具有文件作用域的变量可能有内部或外部链接。
一个具有外部链接的变量可以在一个多文件程序的任何地方使用;一个具有内部链接的变量可以在一个文件的任何地方使用。
分辨一个变量具有内部还是外部链接,看其定义是否使用了存储类说明符static:
存储时期:
一个C变量有以下两种存储时期之一:静态存储时期(static storage duration)和自动存储时期(automatic storage duration)。
如果一个变量具有静态存储时期,它在程序执行期间将一直存在。具有文件作用域的变量具有静态存储时期。
具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定义这些变量的代码段时,将为这些变量分配内存;当退出这个代码块时,分配的内存将被释放。
C使用作用域、链接和存储时期来定义5种存储类:自动、寄存器、具有代码块作用域(空链接)的静态、具有外部链接的静态、具有内部链接的静态。
5种存储类:
存储类 时期 作用域 链接 声明方式
自动 自动 代码块 空 代码块内
寄存器 自动 代码块 空 代码块内,使用关键字register
具有外部链接的静态 静态 多文件 外部 所有函数外
具有内部链接的静态 静态 单文件 内部 所有函数外,使用关键字static
空链接的静态 静态 代码块 空 代码块内,使用关键字static
一、自动
除非您显式地初始化自动变量,否则它不会被自动初始化。
二、寄存器