回复 楼主 davidguhao
C 语言中变量具有 3 个性质:存储期限、作用域、链接性。
存储期限决定了为变量预留和内存被释放的时间:
具有
自动存储期限的变量在所属块被执行时获得内存单元,并在块终止时释放内存单元,从而会导致变量失去值;
具有
静态存储期限的变量在程序运行期间占有同一个的存储单元,也就允许变量无限期地保留它的值。
变量的作用域指可以引用变量的那部分程序文本:
块作用域:变量从声明的地方一直到所在块的末尾都是可见的;
文件作用域:变量从声明的地方一直到所在文件的末尾都是可见的。
变量的链接确定了程序的不同部分可以共享此变量的范围:
外部链接:变量可以被程序中的几个文件共享;
内部链接:变量只能属于单个文件,但此文件中的函数可以共享该变量;
无链接:的变量属于单个函数,并且不能被共享。
变量的默认存储期限、作用域和链接都依赖于变量声明的位置:
程序代码:
int i; //静态存储期限、文件作用域、外部链接
void f(void) {
int j; //自动存储期限、块作用域、无链接
}
可以通过指定存储类型来改变变量的性质。
===
对于不同的存储类型的变量,其性质如下:
auto
auto 存储类型只对属于块的变量有效。auto 变量具有自动存储期限、块作用域,并且无链接。对于块内部声明的变量,默认是 auto 存储类型的。
static
static 存储类型可用于全部变量。当用在块外部时,说明变量具有内部链接;当用在块内部时,说明变量具有静态存储期限。
程序代码:
static int i; // 静态存储期限、文件作用域、内部链接
void f(void) {
static int j; // 静态存储期限、块作用域、无链接
}
extern
extern 声明中的变量始终具有静态存储期限,变量的作用域依赖于声明的位置,如果声明在块内部,那么变量具有块作用域;否则,变量具有文件作用域。如果变量在文件中较早的位置(任何函数定义的外部)声明为 static,那么它具有内部链接;否则(通常情况下),变量具有外部链接。
register
register 存储类型只对声明在块内的变量有效。register 变量具有和 auto 变量一样的存储期限、作用域和链接。
[此贴子已经被作者于2016-8-9 21:23编辑过]