动态存储方式与静态存储方式;
变量的属性作用域在空间的角度来分析,分为局部变量和全局变量
变量还有一种属性存储期(生命期)
这个属性可以分为{
动态存储期
静态存储期
}
这个分为是由变量的静态存储方式和动态存储方式决定的
存储空间可以分为三部分;
程序区
静态存储区
动态存储区
全局变量放在静态存储区
程序开始时,分配存储单元,结束时释放空间
程序执行时他们占据固定的存储单元,不是动态分配的
动态存储区放的是:函数形参,函数中的自动变量,函数调用时的现场保护和返回地址;
1、自动变量;
如果不是用static关键字加以声明,编译器会动态的分配存储空间
在函数结束是会释放这些空间
因此局部变量称为自动变量 自动变量用auto作存储类别的声明
默认都是自动变量
2、用static声明静态局部变量
在函数调用结束后不消失而保留原值,其占用的存储单元也不释放
在下次调用时该变量保留上一次函数调用结束时的值
附上一个小例子:
#include <iostream>
using namespace std;
int f(int a)
{
auto int b = 0;
static int c = 3;
b = b+1;
c = c+1;
return a+b+c;
}
int main (int argc, const char * argv[])
{
int a = 2;
for(int i=0;i<5;i++)
cout<<f(a)<<"\n";
return 0;
}
3、用register声明寄存器变量;
一般的变量都是存储在内存中的,在程序需要的时候,就把变量从内存中读取到运算器中,加入有个别的变量需要重复的用到,那么在读取内存变量的过程中就花费了大量的时间,所以可以通过register声明寄存器变量在运算器中,以提高运算速度;
4、用extern声明外部变量
全局变量(外部变量)
是在函数的外部定义的,作用域是从变量定义处开始到文件末尾。
但是如果你额外部变量不是在文件的开头定义,那么他的有效范围只限于文件定义处到文件末尾;
estern int a, a 是一个已经在别处定义的变量;
5、用static声明只限于本文件使用的外部变量
加入两个文件中都有number变量
file1中用static定义
file2即使用了extern也不能引用file1中的number变量
综上所述:
C++中允许四种存储类别
auto //字符型自动变量,在函数内定义
static //静态局部整形变量或静态外部整形变量
register //整形寄存器变量,在函数内定义
extern //声明一个已经定义的外部整形变量