静态变量(Static Variable)在计算机编程领域指在
程序执行前系统就为之
静态分配(也即在运行时中不再改变分配情况)
存储空间的一类
变量。与之相对应的是在运行时只暂时存在的
自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在
调用栈上分配与释放。
而在以
Pascal为代表的许多
程序语言中,所有
局部变量都由系统自动分配存储空间,而所有
全局变量的存储空间则以静态分配的方式获取(对应“静态变量”),因此由于实际上“局部变量”和“全局变量”这两个
术语已足以涵盖所有的情况,在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。一般来说,在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在
编译后的代码里二者也以相同的方式获取存储空间。而今术语“静态变量”的概念则主要基于C族语言的“static”的定义(即定义2)。
静态变量也可以用于存储
常数。具体来说,静态变量(全局变量及
汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在
编译时设定,并且无法在
运行时改变。编译器通常将静态常量与文本一起置于
目标文件的文本区域,而非常量
初始化数据则置于数据区;而如若有需要,有些
编译器还可选择为其开辟专用区;为防止常数变量被错误的
指针写入覆盖,亦可在这块区域启用内存保护机制。
在
C语言及由其派生出的
C++与
Objective-C等程序语言中,“static”是用于控制变量的生命周期和
连接方式(即其
作用域,亦即可见性)的
保留字。确切来说,正如C族语言中的extern,auto与register这些保留字一样,static也是一种存储类(此处的“类”与面向对象语言的“
类”的定义不同)标识。每个变量与函数都有以上的一种存储类标识,如果在
声明中没有明确标识其存储类,编译时就会根据上下文来选择其默认存储类,如在源文件里的所有文件级变量对应的默认存储类是extern,而在函数体内的变量对应的则是auto,各存储类的属性如下表所列。
除明确标识出变量的
生命周期外,将变量声明为static存储类还会根据变量属性不同而有一些特殊的作用: