根据变量定义的位置可以分为:
- 全局变量,is指定义在函数体外部的变量,能被所有函数使用。
- 局部变量,is指定义在函数或附和语句中的变量,只能在函数或附和语句中使用。
变量的作用域scope,is变量的有效范围。变量有4种不同的作用域:①文件作用域 file scope(全局);②函数作用域 function scope;③块作用域 block scope;④函数原型作用域 function prototype scope。
变量的存储类型
变量的类型,is指变量在内存中的存储方法,分为静态存储和动态存储,具体分为:
①自动型 auto
auto说明符,定义的是一个局部变量。局部变量,如果不加关键字static加以声明,编译系统对其进行动态分配存储空间。局部变量的默认存储类型为auto。
②寄存器型 register
将频繁使用的局部变量存放到CPU的寄存器中,不用反复存取内存耗费时间,用关键字register声明。但现今的编译系统能够识别频繁使用的局部变量,自动将其存放到CPU的寄存器中,所以实际上不用register声明变量。
③外部型 extern
对所有模块共同使用的全局变量,在所有模块中都定义,连接时会出错。因此,在一个模块中定义该全局变量,在其他模块中使用关键字extern来声明其是一个“外来”的全局变量(外部型变量声明)。
extern 数据类型 标识符
- 标识符,可以是变量名or函数原型。
外部型变量也可用于同一个文件中全局变量的提前引用声明。
④静态型 static
将函数声明为static变量:将某些变量在该函数调用结束后仍然存放在内存中,可被下次调用时继续使用。static说明符也可以用于声明外部变量。
static 数据类型 变量名=初值;
static可以声明:①全局静态变量:只能供本模块使用,不能被其他模块再声明为extern变量。②局部静态变量:is局部变量(作用域内存取)+全局变量(变量值只初始化一次)=供函数局部存取的全局变量。
根据变量的定义位置(全局or局部)and存储类型(静态or动态),可以知道变量的作用域and存储期/生命周期 storage duration,表明变量的类型。
变量在内存中的存储
C++程序的内存通常分为5各区:
①全局数据区 data area
存放:全局变量 静态变量 全局常变量
周期:程序加载/运行时分配,运行完释放
②代码区 code area
存放:程序运行的函数
周期:程序加载时分配,运行完释放
③栈区 stack area
存放:局部变量 函数参数 程序返回地址
周期:程序运行过程中,e.g:函数调用时建立,调用完释放
④堆区 heap area
存放:new产生的对象
周期:用户程序中用new分配,用delete释放
⑤字符串常量区
存放:字符串常量
周期:程序运行过程中生成,程序运行完成后释放
- 一般常量/非常常量(除字符串常量)是一个“立即数”,在程序代码中。
- 局部常变量(除字符串常量)与局部变量同等看待。
- 全局变量、静态变量与常量的存储很难细分,可以统称全局数据区。
- 堆空间,即使指向堆空间的指针变量消失,new语句分配的空间也不会消失,需由delete语句释放。
变量的生存期,is从产生到消失的时期。
- 静态生存期:整个程序的生存期(全局变量/全局常变量/静态变量/字符串常量)。
- 动态生存期:起于函数调用,结束于函数调用结束(局部变量)。