- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
存储类型(storage class)决定标识符的存储区域,即编译系统在不同区域为不同存储类型的标识符分配空间。由于存储区域不同,标识符的生命期也不同。 3.6 存储类型与标识符的生命期 生命期: 指标识符从获得空间到空间释放之间的期间, 标识符只有在生存期中、并且在其自己的作用域中才 能被访问。 3.6.1 存储类型 1 自动存储类型 用auto说明的变量为自动变量,通常auto缺省。局部变 量都是自动变量,生命期开始于块的执行,结束于块的结 束,原因:自动变量的空间分配在栈中,块开始执行时 系统自动分配空间,块执行结束时系统自动释放空间。自 动变量的生命期和作用域是一致的。 为提高程序运行效率,可以将某些变量保存在寄存器 中,即用register说明为寄存器变量,但不提倡使用。 C++中关于存储类型的说明符有四个: auto、register、static和extern。 其中:用auto和register修饰的称为自动存储类型, 用static修饰的称为静态存储类型, 用extern修饰的称为外部存储类型。 static说明的变量称为静态变量。根据定义的位置不同,还分为局部静态变量和全局静态变量,也称内部静态变量和外部静态变量。静态变量均存储在全局数据区,如果程序未显式给出初始化值,系统自动初始化为全0,且初始化只进行一次;静态变量占有的空间要到整个程序执行结束才释放,故静态变量具有全局生命期。 局部静态变量是定义在块中的静态变量,当块第一次被执行时,编译系统在全局数据区为其开辟空间并保存数据,该空间一直到整个程序结束才释放。局部静态变量具有局部作用域,但却具有全局生命期。 2 静态存储类型 【例3.10】 自动变量与局部静态变量的区别 int st(){ static int t=100; //局部静态变量 t++; return t; } int at(){ int t=100; //自动变量 t++; return t; } int main(){ int i; for(i=0;i5;i++) coutat()\t; coutendl; for(i=0;i5;i++) coutst()\t; coutendl; return 0; } i= 0 t= 100 1 2 3 4 5 101 101 101 101 101 i= 0 t= 100 1 2 3 4 5 101 101 101 101 101 at() st() 例: #include iostream.h int f(int a) { //定义f函数,a为形参 auto int b=0; //定义b为自动变量 static int c=3; //定义c为静态局部变量 b=b+1; c=c+1; return a+b+c; } void main( ) { int a=2,i; for(i=0;i3;i++) coutf(a)″ ″; coutendl; } 输出:7 8 9 使用局部静态变量的情况: (2) 如果初始化后,变量只被引用而不改变其值,避免每 次调用时重新赋值。 (1)需要保留函数上一次调用结束时的值。 例:设计函数输出1~5的阶乘(1!,2!,3!,4!,5!)。 #include iostream.h int fac(int); //函数声明 void main( ) { int i; for(i=1;i=5;i++) couti″!=″fac(i)endl; } int fac(int n) { static int f=1; //f为静态局部变量,函数结束时f的值不释放 f=f*n; //在f原值基础上乘以n return f; } 每次调用fac(i),就输出一个i,同时保留这个i!的值,以便下次再乘(i+1)。 3.6.1 存储类型 3 外部存储类型 使用extern来声明全局变量,可以扩展全局变量的作 用域。 1. 在一个
文档评论(0)