一个变量除了数据类型以外,还有3种属性:
(1)存储类别:C++允许使用auto,static,register,extern4种存储类别
- auto:自动变量,动态存储方式
函数中的局部变量,如果不加static声明,默认就是自动变量
- static:静态变量
静态局部变量
静态外部变量
- register:寄存器变量
- extern:声明外部变量
(2)作用域:指在程序中可以引用该变量的区域
(3)存储期:指变量在内存中的存储周期
下面从不同角度分析它们之间的联系:
- 从作用域角度分:
- 从变量存储期(存在时间)来分,有动态存储和静态存储两种类型。静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元
- 从变量值存放的位置来区分
- 作用域和存储期:
如果一个变量在某文件或函数范围内是有效的,则称该文件或函数为该变量的作用域,在此作用域内可以引用该变量,所以又称变量在此作用域内“可见”,这种性质称为变量的可见性。
存在性指变量没有被销毁,在其存储期内,是存在的
变量存储类别 | 函数内 | 函数外 | ||
作用域(可见性) | 存在性 | 作用域(可见性) | 存在性 | |
自动变量和寄存器变量 | √ | √ | × | × |
静态局部变量 | √ | √ | × | √ |
静态外部变量 | √ | √ | √(只限本文件) | √ |
外部变量 | √ | √ | √ | √ |
static声明使变量采用静态存储方式,但它对局部变量和全局变量所起的作用不同。对局部变量来说,static使变量由动态存储方式改变为静态存储方式;而对全局变量,它使变量局部化(局限于本文件),但仍为静态存储方式。从作用域角度看,凡有static声明的,其作用域都是局限的,或者局限于本函数内(静态局部变量),或者局限于本文件内(静态外部变量)。