C语言变量的存储类别
内存中供用户使用的存储空间分为代码区与数据区两个部分。变量存储在数据区,数据区又可分为静态存储区与动态存储区。
静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。
动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。
对于静态存储方式的变量可在编译时初始化,默认初值为O或空字符。对动态存储方式的变量如不赋初值,则它的值是一个不确定的值。
在C语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种。静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器。
一、auto变量
函数中的局部变量,未加static,则自动为auto变量。包括函数中的形参和在函数定义中的变量以及复合语句中定义的变量。这些变量在调用时自动为它们分配存储空间。调用完成后则释放空间。
二、register变量
一般情况下,变量的值是存放在内存中的。当使用时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算。如果需要存数,再从运算器将数据送到内存存放。
如果一些变量使用频繁,则可以将其存放在register中,而不必花费时间到内存中取数,存数,以节省时间。
注:只有局部自动变量和形参可以作为寄存器变量;再者一个计算机系统中的寄存器数目是有限的。
三、extern 外部变量(一个全局变量或者函数默认情况为extern,因此无法在不同.c文件里定义相同名称的全局变量)
当一个变量在另一个文件中定义时,可以在该文件中声明为extern变量,从而可以访问到另一个文件中定义的全局变量
file1 : int a; //定义
file2 :extern int a; //声明
四、static声明的局部变量
用static声明的局部变量。在函数调用结束后并不释放存储空间。在下一次调用时,其值为上一次函数调用结束时的值。存储于静态存储区,初始值为0。虽然静态变量的值在函数调用以后仍然存在,但其他函数并不能引用它(满足局部变量的要求)。
五、static声明的全局变量
限制一个外部变量只被本文件引用,而不可以被其他的文件引用。
file1 : int a;
file2 :static int a;
a、对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在。b、全局变量用static声明,则该变量的作用域只限于本文件模块
C语言变量的作用域
C程序的标识符作用域有三种:局部、全局、文件。标识符的作用域决定了程序中的哪些语句可以使用它,换句话说,就是标识符在程序其他部分的可见性。通常,标识符的作用域都是通过它在程序中的位置隐式说明的。
1.局部作用域
局部作用域的变量,都是声明在函数内部,无法被其他函数的代码所访问。函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块。
像大括号{}中定义的变量也只有局部作用域;
2.全局作用域
对于具有全局作用域的变量,我们可以在程序的任何位置访问它们。当一个变量是在所有函数的外部声明,也就是在程序的开头声明,那么这个变量就是全局变量。全局作用域的变量可以跨文件访问,只需要用extern声明一下,指出在该文件的外部已经定义了这个变量即可。在大的工程里,extern声明一般放在.c文件对应的头文件.h里,#include这个头文件就可以了。
3.文件作用域
在很多C语言书上,都没有说明文件作用域,或者只是略微的提到,其实文件作用域在较大程序中很有作用(在多文件系统中)。文件作用域是指外部标识符仅在声 明它的同一个转换单元内的函数汇总可见。所谓转换单元是指定义这些变量和函数的源代码文件(包括任何通过#i nclude指令包含的源代码文件)。static存储类型修饰符指定了变量具有文件作用域。也就是说无法像全局作用域变量那样通过extern来访问了。