说明
在C语言中,变量和函数都有数据类型和存储类型两个属性。
数据类型规定了取值范围和运算。
存储类型规定了占用内存的方式。
变量的存储类型可分为静态存储和动态存储。
静态存储
生命周期为程序的运行时间。
动态存储
动态分配内存,用完就放。
内存的区域划分
操作系统等 | 系统区 |
程序区 | 用户区 |
静态存储区 | |
动态存储区 |
存储类型
auto
register
extern
static
下面开始介绍
自动变量(auto)
属于动态存储类型。
属于局部变量,只能在函数内和复合语句中定义。
auto int a;
auto可以省略,因为系统默认是自动变量。
外部变量(extern)
属于静态存储类型。
属于全局变量。
extern int a;
用于说明同一个源程序不同源文件中的变量。
静态变量(static)
属于静态存储类型。
用于改变变量的存储类型。
static int a;
注意:静态局部变量生存期为整个源程序,但作用域为定义它的函数和复合语句。
静态全局变量生存期不变,但作用域为定义它的源文件。
从中我们可以看出:把局部变量改为静态局部变量是改变了它的存储方式,即改变了它的生存期。
把全局变量改为静态局部变量是改变了它的作用域,限制了它的使用范围。
寄存器变量(register)
属于动态存储类型。
变量一般放在存储器内,我们知道CPU是需要从存储器中访问数据的,如果对一个变量需要频繁访问,就会耗费时间,因此C语言提供了寄存器变量,将这种变量直接放在CPU寄存器中,需要时直接读写。
register i;
for(i=0;i<10000;i++)
printf("666");
说明
一是只有局部自动变量和形式参数可以定义为寄存器变量。
二是这个修饰符已经过时,目前大多数编译器可以做到程序优化,它自己会决定哪些变量是寄存器变量,而程序员指定的register型变量可能无效。