从变量的存在时来看,分为静态存储方式和静态存储方式。
静态存储方式是指在程序运行开始时由系统分配固定的储存空间的方式。
而动态存储方式是指在程序运行期间根据需要进行动态的的分配储存空间的方式。
程序内存映像:
程序区 |
静态存储区 |
动态存储区 |
凡是在函数外声明的变量储存在静态存储区;
凡是在函数内前面没加static声明的变量,都储存在动态存储区。
在c语言中变量储存类型有以下四种:
1.auto变量: 自动变量 (动态存储)
2.register 寄存器变量(动态存储)
3.extern 外部变量(静态存储)
4.static 静态变量(静态存储)
1、auto变量
函数中的局部变量,如不专门声明为static储存类别,都是动态的分配存储空间(栈),数据存储在动态存储区中。在局部变量前面加上auto即声明为自动变量,在调用该函数时,系统会给它们分配存储空间,在函数调用结束时,自动释放这些存储空间。auto一般情况可省略。
2、用stastic声明局部变量
有时希望函数中的局部变量的值在函数调用结束后不消失,即存储单元不释放。
这时就应指定局部变量为“静态局部变量”,用static进行声明。分布在静态存储区。
注:(1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在函数整个运行期间都不释放,而自动变量属于动态存储类别,占动态存储空间而不占静态存储空间,函数调用结束后释放。
(2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时已有初值,无论在该函数中被调用多少次,只在第一次调用时初始化。
(3)若在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量),对自动变量来说,不赋初值则它的值是一个不确定的值。
(4)静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
3、register变量
一般情况下,变量存放在内存中。
但若一些变量使用过于频繁则会浪费很多时间(cpu处理数据与内存读取数据有时间差)。
为提高程序执行效率,C语言允许将局部变量的值放在CPU寄存器中,需要时直接取出参加运算,不必再到内存中去存取。
这种变量称为寄存器变量,用关键字register作声明。
4.extern变量
在一个文件内声明外部变量;外部变量的作用域从定义处到文件结束,用extern声明。