1.变量的类型
除了按数据类型区分变量外,根据变量定义的位置,可以把变量分成全局变量(global variable)与局部变量(local variable)。全局变量是指定义在函数体外部的变量,它能被所有函数使用。局部变量是指定义在函数或复合语句中定义的变量,只能在函数或复合语句中使用
int g=100000;
int sum(int x, int y)
{
int sum=0;
for(int i=x;i<=y;i++)
sum=sum+i;
return sum;
}
int main()
{
int x=1,y=100;
cout<<sum(x,y)+g<<endl;
return 0;
}
其中g为全局变量,sum()中下,x,y为全局变量,main()中的x,y为局部变量
2.变量的存储类型
C++中变量有auto 、extern、register、static四种存储类型。
1.auto说明符
auto说明符说明定义的是一个局部变量。函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态分配存储空间的。局部变量默认存储类型为auto,所以在程序中很少使用auto说明符说明。
2. register说明符
为提高执行效率,C++允许将局部变量的值存放在CPU的寄存器中,需要时直接从寄存器中取出参加运算,不必到内存中去存取,这种类型的局部变量称为寄存器变量,用关键字register声明。在程序中定义寄存器变量对编译系统只是建议性的,而不是强制性的。
3. extern说明符
如果一个完整的计算机程序很大,分成多个模块,放在不同的文件中,分开编译成目标文件,最后连接成一个完整的可执行代码。对于所有模块共同使用的全局变量,如果在所有的模块中都定义,在连接时就会出错。 解决办法是只在一个模块中定义全局变量,在其他模块中用extern说明这是一个“外来”的全局变量。
4. static说明符
static说明符用于在定义变量时将变量声明为成static(静态)变量。 其格式为:
static 数据类型 变量名=初值;
static可用来声明全局静态变量和局部静态变量。当声明全局静态变量时,全局静态变量只能供本模块使用,不能被其它模块再声明为extern变量。
例如:将程序p4_1_p.cpp中的全局变量声明为:
static int G=0;
那么在其他模块中就不能声明为:
extern int G; //错误,G已经是一个static变量;
注意: 当一个局部变量声明为static变量,它既具有局部变量的性质:只能在函数体局部存取;又具有全局变量的性质:函数多次进入,变量的值只初始化一次。因此静态局部变量实质是一个供函数局部存取的全局变量。
运行结果:
m=1 n=1
m=1 n=2
m=1 n=3
m=1 n=4
3.变量在内存中的存储
当一个程序准备运行时,操作系统会为程序分配一块内存空间,C++程序的内存通常被分为四个区:
①全局数据区(data area)
②代码区(code area)
③栈区(stack area)
④堆区(heap area)
全局变量、静态变量、字符串常量和常变量存放在全局数据区;所有的函数和代码存放在代码区;为运行函数而分配的函数参数、局部变量和返回地址存放在栈区;动态分配内存在堆区。 变量的生存期为从产生到消失的时期。全局变量、静态变量、常变量生存周期为整个程序的生存周期,因此称为静态生存期;局部变量的生存周期起于函数调用,结束于函数调用结束,其生存期是动态的,因此称为动态生存期。
注意: 堆空间不是系统为程序自动分配的,它是程序执行过程中由new语句为变量分配的。即使指向堆空间的指针变量消失,new语句分配的空间也不会消失。new语句分配的空间由delete语句释放。
解释 : 当函数被调用时才为函数的形参、返回代码地址、局部变量分配空间。由于空间 在栈中,所以从栈底开始依次按形参、返回代码地址、局部变量的顺序从高地址 向低地址分配。其中,在分配形参地址时,按从右向左的顺序;分配各局部变量 的地址时,按定义的先后次序。 当函数调用结束,该函数占用的栈空间收回。收回的顺序(即各变量消失的顺序) 与分配的顺序相反。 程序运行时,系统为各个函数的执行代码在代码段中分配空间,然后将代码调入 内存。各函数在代码区的排列次序按函数定义的先后次序。程序运行结束,程序 占用的代码段空间收回。 全局常变量、全局变量、局部静态变量、字符串常量在程序运行前在全局数据区 进行分配。并且依次按照全局常变量、全局变量、局部静态变量的顺序从低地址 向高地址分配,其中各类变量按定义的先后次序分配。 当程序运行结束后,各全局变量的空间被系统收回,收回的顺序与分配的顺序相 同,即:先分配先收回。 堆空间不是系统为程序自动分配的,它是程序执行过程中由new语句为变量分配 的。即使指向堆空间的指针变量消失,new语句分配的空间也不会消失。New语句 分配的空间由delete语句释放。 变量的生存期为从产生到消失的时期。全局变量、静态变量、常变量生存周期为 整个程序的生存周期,因此称为静态生存期;局部变量的生存周期起于函数调用, 结束于函数调用结束,其生存期是动态的,因此称为动态生存期。