存储类型、标识符的生命周期

来源:互联网 发布:中国软件与即时 编辑:程序博客网 时间:2024/05/01 14:42

auto和register修饰的称为自动存储类型,static修饰的称为静态存储类型,extern 修饰的称为外部存储类型。

1、自动存储类型

局部变量都是自动变量,生命期开始于块的执行,结束于块的结束。

寄存器变量用register修饰,不同编译器对哪些变量可以说明为寄存器变量有不同的规定。一般不提倡。

2、外部存储类型

一个C++程序可由多个源程序文件组成。多文件程序系统可以通过外部存储类型的变量和函数来共享某些数据和操作。

一般定义的全局变量和函数默认为外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果要使用这个文件中定义的全局变量和函数,则应该在使用前用extern进行外部声明。

此外,在同一个文件中,如果一个函数使用到定义在该函数之后的全局变量,那么也必须对使用到的全局变量进行外部变量声明,以满足先定义后使用的原则。

/* Ex1.cpp ,由main()组成*/# include <iostream>using namespace std;void fun2();//外部函数声明,等价于extern void fun2();int n;//全局变量定义int main(){n=1;fun2();// fun2()定义在文件Ex2.cpp中cout<<"n="<<n<<endl;return 0;}
/* Ex2.cpp,由fun2()组成*/extern int n;//外部变量声明,n定义在文件Ex1.cpp中void fun2() {//fun2()被文件Ex31.cpp中的函数调用n=3;}

3、静态存储类型

根据定义的位置不同,分为局部静态变量和全局静态变量。静态变量均存储在全局数据区,默认初始化为0;静态变量占有的空间要到整个程序执行结束后才释放。因此静态变量具有全局生命期。

局部静态变量是定义在块中的静态变量,编译器在全局数据区中为其开辟空间并保存数据,该空间一直到整个程序结束时才释放。局部变量具有局部作用域,但却具有全局生命期

/*Ex3 自动变量与局部静态变量的区别。*/#include <iostream>using namespace std;int st();int at();int main(){ int i; for(i=0;i<5;i++)  cout<<at()<<'\t'; cout<<endl; for(i=0;i<5;i++)  cout<<st()<<'\t'; cout<<endl; system("pause"); return 0;}int st(){ static int t=100; //局部静态变量 t++; return t;}int at(){ int t=100; //自动变量 t++; return t;}


st()中的t是局部静态变量,与程序有相同的生命期,其初始化只在最初进行一次,每次调用修改的值都会被保留下来。

/*Ex4 局部静态变量*/#include <iostream>using namespace std;int counter(int i){static int count=0;count=count+i;return count;}void main(){int i,j;for(i=0;i<=5;i++){j=counter(i);}cout<<"j="<<j<<endl;system("pause");}


0 0
原创粉丝点击