在C语言中,每个变量和函数都有两个属性,一个是数据类型,一个是数据存储类型。
存储类别指的是数据在内存中存储方式。存储方式分为两大类:静态存储类和动态存储类。具体包含4种:自动(auto)、静态(static)、寄存器(register)、外部(extern)。通过变量的存储类型,就可以知道变量的生产周期和作用域。
1.auto变量
函数中的局部变量,如果不专门声明为static存储类型,都是动态的分配存储空间,数据存储在动态存储区中。例如函数中的形参和在函数中定义的变量,只有在函数被调用的时候系统才为其分配内存空间,当调用结束是就会自动释放这些内存空间。程序中大多数变量属于自动变量,函数中定义的变量都没有声明为auto,其实都是隐含指定为自动变量。
2.static变量
静态变量是在函数调用结束后仍然占用存储单元不释放,在下次调用变量时已经有值。这种变量用static来声明。
特点:1.静态局部变量属于静态存储类别,在静态存储区内分配存储单元,整个程序运行期间都不释放。而auto变量属于动态存储类别,当函数被调用结束释放内存单元。
2.静态局部变量是在编译时赋初值,只赋值一次,以后每次调用时不在重新赋值而只是保留上次函数调用结束时的值。而auto变量是在函数被调用是进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3.定义局部变量不初始化时,对于静态局部变量来说,编译时自动赋初值0(数值型变量)或空字符(对字符变量)。而对auto变量,如果不对其初始化其值是一个不确定的值。
4.虽然静态局部变量在函数调用结束后仍然存在,但是其它函数不能引用它。
3.register变量
寄存器变量针对使用频繁的变量,例如被循环很多次数函数引用的变量,因为当函数调用某个变量时,首先由控制器发出指令将内存的变量的值送到运算器中,经过运算器运算后,如果需要存数,再从运算器将数据送到内存中,显然为存取变量要花费不少时间。为了提高执行效率,C语言允许将局部变量的值放在CPU的寄存器中,这样变量运算时不在到内存中存取,直接在寄存器存取进行运算。
关键字register做声明。
说明:只有局部自动变量和形式参数可以作为寄存器变量,局部静态变量和全局变量是不可以的。计算机系统中的寄存器数目有限,不能任意定义多个寄存器变量,而且不同的系统对寄存器变量处理也是不同的。
4.extern变量
外部变量是在函数外部定义的全局变量,作用域从变量定义开始,到本程序文件结束。
一个C程序既可以包含一个源程序文件又可以包含多个源文件程序。对于单源文件程序,extern变量作用域从定义处到文件技术为止,如果在定义前引用该变量可以通过用关键字extern对该变量做“外部变量声明”,表明该变量是一个extern变量。
对于多源文件程序来说,只需要在某一个文件中定义,然后在其他文件中对其做“外部变量声明”即可。
变量的声明可以通过 extern i 或者加上变量i 的类型如:extern int i。