目录
变量的存储位置
一个C语言程序经过编译程序的编译和链接之后,生成可执行的机器语言程序。系统在执行该程序时,要为该程序分配内存空间,然后将程序装入该内存空间才能开始执行。系统为一个执行的程序分配的内存空间分为3部分:程序区,静态存储区、动态存储区。
程序区用来存储程序的可以执行的代码,例如函数的地址就应该在这个内存区域内。
静态存储区和动态存储区都用来保存程序中使用的数据,变量的地址就应该在这两个内存区域内。一个变量保存在静态存储区还是动态存储区是由变量的存储类型来决定的。
变量的生命期/生存期
变量的生存期是指变量值的保留时间,可分为两种情况:
(1)静态存储
变量存储在内存中的静态存储区,一般在编译时就分配存储空间,在整个程序运行期间,该变量占有固定的存储单元,变量的值都始终存在,程序结束后,这部分内存空间才释放。这类变量的生存期为整个程序。
静态存储方式的变量有全局变量(extern)和静态局部变量(static)两种。静态变量在定义时如果不指定初值,则静态变量分配的所有内存空间都被自动填0
extern变量
外部变量就是定义在函数之外的变量,又称为全局变量。它的作用域是从变量定义之处开始,到源文件的末尾。在此作用域内外部变量可以被所有的函数访问。使用外部变量声明语句可以扩展外部变量的作用域,使其在整个程序范围内都有效。
外部变量的声明格式:
extern 类型说明符 变量名;
1.在由一个源文件构成的程序内声明外部变量
int a, b;//外部变量
void f1()
{
extern float x, y;//外部变量x,y声明
}
float x, y;//外部变量
int f2()
{}
main()
{}
在一个函数之前定义的全局变量,在该函数内使用可不再加以声明。具体可分析上面的代码。定义和声明的区别见上一篇文章:变量及作用域
2.在有多个源文件构成的程序中声明外部变量
一个C语言程序可以由一个或多个源文件组成,如果外部变量的定义域声明在两个不同的文件,要是用其他文件中定义的外部变量,就必须在使用该外部变量之前,用extern对外部变量进行声明。
extern仅仅是说明变量是“外部的”,以及它的类型,并不真正分配存储空间。再将若干个文件链接生成一个完整的可运行程序时,系统会将不同文件中使用的同一外部变量连在一起,使用系统分配的同一存储单元。
从模块化设计的观点来看,尽量不要使用全局变量。
static变量
静态变量定义的一般格式为:
static 类型标识符 变量名
1.静态局部变量
当在函数体或复合语句内用static来声明一个变量时,该变量就被称为静态局部变量。
静态局部变量属于静态存储类别,在静态存储去分配存储单元,它具有以下特点:
(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在,它的生存期为整个程序运行期间。
(2)静态局部变量的生存期虽然为整个程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(3)静态局部变量是在编译时赋初值,且只能赋初值一次,在程序运行时它已有初值,以后调用函数时不再重新赋值而只是保留上次函数调用结束时的值。
(4)如定义时对静态局部变量未赋初值,则编译时系统自动赋初值0或空字符。
根据静态局部变量的特点,可以看出它是一种生存期为整个程序的变量。虽然离开定义它的函数后不能使用,但如果再次调用定义它的函数时,它又可继续使用,而且保存了前次调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可以考虑采用静态局部变量。
2.静态全局变量
静态全局变量(又称静态外部变量)是在函数之外定义的。如果在程序设计中希望某些变量只限于其本文件使用,而不能被其他文件使用,则可以在定义全局变量时加上static就构成了静态全局变量。
(2)动态存储
变量存储在内存中的动态存储区,在程序运行过程中,只有当变量所在函数被调用时,编译系统才临时为该变量分配内存空间,函数调用结束,这部分内存空间释放,变量值消失。这类变量的生存期仅在函数调用期间。
auto变量
auto变量又称自动变量,是C语言程序中使用最广泛的一种类型。它的定义必须在一个函数体内或复合语句内进行。C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量说明符auto可以省略。函数的形参也属于此类。
自动变量属于动态存储方式,在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。如果不赋初值,则变量的值为随机的不定值。
自动变量的作用域仅限于定义该变量的函数或复合语句内。因此,不同的函数或复合语句中允许使用同名的变量而不会混淆。
register变量
在计算机中,从内存存取数据要比直接从寄存器存取数据慢,当对一个变量频繁读写时,就要反复访问内存存储器,从而花费大量的存取时间。为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可以提高效率。
寄存器变量的定义格式:
register 类型标识符 变量名表列
由于计算机的寄存器数目有限,并且不同的计算机系统允许使用寄存器的个数不同,所以并不能保证定义的寄存器类型变量就会保存在寄存器当中,当寄存器不空的时候,系统自动将其作为一般auto变量处理。