C语言中变量的存储类型:
- 变量的存储类型:是指存储变量值的内存类型。
- 变量的存储类型决定了 变量何时创建、何时销毁、保持多久。
- 有三个地方可以存储变量:普通内存、运行时堆栈、硬件寄存器。
变量的缺省(default,同默认)存储类型时,取决于它声明的位置。
- 在任何代码块之外声明的变量总是存储的静态内存中,被称为静态变量,在程序运行之前创建。
- 在代码块内部声明的变量的缺省存储类型是自动的,存储于堆栈中,称为自动变量,auto关键字就是用于修饰这用存储类型的,但是常常被省略。
在代码块内部声明的变量加上static关键字,可以使它的存储类型由自动变为静态。注意:
- 修改变量的存储类型并不表示修改变量的作用域。
- 函数的形参不能声明为静态,因为实参总是在堆栈中传值给函数,而且形参接收的值会保存在栈中,用于支持递归。
register关键字将自动变量(全局变量是不允许的)声明为寄存器变量。
- 作用:提示声明的自动变量应该存储于硬件寄存器而不是内存中。
- 寄存器变量比存储于内存中的变量访问起来效率更高。
- 编译器不一定理睬register关键字,有太多的变量被声明为register,它只选前几个存储于寄存器,其余的就按普通自动变量处理。
- 同样,也完全有可能,这个优化措施所节省地时间和空间的开销,还抵不上赋值这几个值所用的开销。
- 寄存器变量的创建时间和销毁时间与寄存器变量相同,但需要一些额外的工作:在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值必须恢复,确保调用者的寄存器变量是未被破坏的(因为寄存器的空间十分有限,所以会用这种临时替换的方式)。
- 机器并不向你提供寄存器变量的地址。
静态变量初始化问题:
- 静态变量的初始化:把可执行程序文件想要初始化的值,放在当程序执行时变量会使用的位置。
自动变量的初始化:
- 自动变量的初始化较之赋值语句的效率并无提高。
- 每次执行函数时重新初始化。
- 优点:由于初始化在运行时执行,所以可以用任何表达式作为初始值。
- 如果不显示地初始化,当自动变量创建时,它们的值都是垃圾。
静态变量与define的初始化时机: