持续性:变量在内存中是否存在(即何时分配内存,何时释放内存)
自动:程序开始执行相关函数或代码块时被创建,执行完函数或代码块时被释放
静态:程序整个运行过程中都存在
动态:new分配时创建,delete时释放
注意:
- 未被初始化的静态变量全部被置为0
- 只能使用常量表达式来初始化静态变量(包括字面值常量 const常量 enum常量 和sizeof操作符)
作用域:变量是否可见
局部:(代码块)从声明位置到定义它的代码块的结尾可见
全局: (文件) 从声明位置到文件结尾之间可见
特殊:函数原型作用域:包含参数列表的括号内可用
类中声明的成员作用域为整个类
名称空间中声明的变量作用域是整个名称空间
注意:作用域解析操作符::表示使用全局版本
链接性:变量如何共享
无链接性:不能共享(即只在代码块内有效)
内部:只能由同一个文件中的函数共享
外部:可在文件间共享
注意:
- 在其他文件中使用 extern 重新声明已经定义过的外部变量,使其在其他文件中可见
- 原始声明称为 定义声明 ,extern声明称为 引用声明
变量的持续性、链接性和作用域可由下表进行判断:
位置 | 持续性 | 链接性 | 作用域 |
函数定义内声明的变量 (自动变量)(关键字auto) | 自动 | 无链接性 | 局部 |
函数定义内,并且使用static声明 | 静态 | 无链接性 | 局部 |
函数定义外,并且使用static声明(或const) | 静态 | 内部 | 全局 |
函数定义外声明 (外部变量) | 静态 | 外部 | 全局 |
new创建的变量 | 动态 |
注意:
- 外部变量和自动变量同名时、局部变量与全局变量同名时:新定义暂时隐藏旧定义
- 不同文件间的同名的全局静态变量相互覆盖(自己的隐藏其他文件的)
- 静态局部变量只进行一次初始化,再次调用该函数时不再初始化
寄存器变量:register声明,放在CPU寄存器中,无内存地址,但编译器不一定会满足要求