您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++语言程序设计教程(第二版)清华出版 杨进才第6章 C++程序的结构
C++语言程序设计教程第11章C++输入输出流制作人:沈显君杨进才第6章C++程序的结构第6章C++程序的结构1.区分各种变量的类型以及在内存中的存放2.理解局部静态变量的双重特征3.区分各种类型标识符以及其作用域与可见性4.掌握预处理命令的常用用途5.理解名字空间的概念与使用方法学习目标C++语言程序设计教程第6章C++程序的结构6.1变量的类型C++语言程序设计教程第6章C++程序的结构intg=100000;intsum(intx,inty){intsum=0;for(inti=x;i=y;i++)sum=sum+i;returnsum;}intmain(){intx=1,y=100;coutsum(x,y)+gendl;return0;}1234567891011121314g为全局变量sum()中x、y为局部变量main()中的x、y为局部变量除了按数据类型区分变量外,根据变量定义的位置,可以把变量分成全局变量(globalvariable)与局部变量(localvariable)。全局变量是指定义在函数体外部的变量,它能被所有函数使用。局部变量是指定义在函数或复合语句中定义的变量,只能在函数或复合语句中使用。6.1.2变量的存储类型C++中变量有auto、extern、register、static四种存储类型。1.auto说明符auto说明符说明定义的是一个局部变量。函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态分配存储空间的。局部变量默认存储类型为auto,所以在程序中很少使用auto说明符说明。2.register说明符为提高执行效率,C++允许将局部变量的值存放在CPU的寄存器中,需要时直接从寄存器中取出参加运算,不必到内存中去存取,这种类型的局部变量称为寄存器变量,用关键字register声明。在程序中定义寄存器变量对编译系统只是建议性的,而不是强制性的。3.extern说明符如果一个完整的计算机程序很大,分成多个模块,放在不同的文件中,分开编译成目标文件,最后连接成一个完整的可执行代码。对于所有模块共同使用的全局变量,如果在所有的模块中都定义,在连接时就会出错。解决办法是只在一个模块中定义全局变量,在其他模块中用extern说明这是一个“外来”的全局变量。C++语言程序设计教程第6章C++程序的结构/****************************p6_1_p.cpp**主程序****************************/#includeiostreamusingnamespacestd;externvoidp1dispG();externvoidp2dispG();externvoidp2dispg();intG=0,g=0;intmain(){p1dispG();p2dispG();p2dispg();coutinpG=Gendl;coutinpg=gendl;return0;}12345678910111213141516171819//p6_1_p1.cpp#includeiostreamusingnamespacestd;externintG;voidp1dispG(){G=11;coutinp1G=Gendl;}123456789//p6_1_p2.cpp#includeiostreamusingnamespacestd;externintG;externintg;voidp2dispG(){G=22;coutinp2G=Gendl;}voidp2dispg(){g=33;coutinp2g=gendl;}123456789101112131415运行结果:inp1G=11inp2G=22inp2g=33inpG=22inpg=33C++语言程序设计教程第6章C++程序的结构6.1.2变量的存储类型4.static说明符static说明符用于在定义变量时将变量声明为成static(静态)变量。其格式为:static可用来声明全局静态变量和局部静态变量。当声明全局静态变量时,全局静态变量只能供本模块使用,不能被其它模块再声明为extern变量。例如:将程序p6_1_p.cpp中的全局变量声明为:staticintG=0;那么在其他模块中就不能声明为:externintG;//错误,G已经是一个static变量;static数据类型变量名=初值;注意:当一个局部变量声明为static变量,它既具有局部变量的性质:只能在函数体局部存取;又具有全局变量的性质:函数多次进入,变量的值只初始化一次。因此静态局部变量实质是一个供函数局部存取的全局变量。C++语言程序设计教程第6章C++程序的结构/***********************************6_2.cpp**静态局部变量的使用***********************************/#includeiostreamusingnamespacestd;voidfun(){staticintn;intm=0;n++;m++;coutm=m,n=nendl;}intmain(){for(inti=0;i4;i++)fun();return0;}1234567891011121314151617181920运行结果:m=1n=1m=1n=2m=1n=3m=1n=46.1.2变量的存储类型static型变量静态局部变量n只是在函数fun()第一次进入时初始化0,随后每次进入不再赋初值C++语言程序设计教程第6章C++程序的结构6.1.3变量在内存中的存储当一个程序准备运行时,操作系统会为程序分配一块内存空间,C++程序的内存通常被分为四个区:①全局数据区(dataarea)②代码区(codearea)③栈区(stackarea)④堆区(heaparea)全局变量、静态变量、字符串常量和常变量存放在全局数据区;所有的函数和代码存放在代码区;为运行函数而分配的函数参数、局部变量和返回地址存放在栈区;动态分配内存在堆区。变量的生存期为从产生到消失的时期。全局变量、静态变量、常变量生存周期为整个程序的生存周期,因此称为静态生存期;局部变量的生存周期起于函数调用,结束于函数调用结束,其生存期是动态的,因此称为动态生存期。注意:堆空间不是系统为程序自动分配的,它是程序执行过程中由new语句为变量分配的。即使指向堆空间的指针变量消失,new语句分配的空间也不会消失。new语句分配的空间由delete语句释放。C++语言程序设计教程第6章C++程序的结构/***************************************p6_3.cpp**显示各类变量的内存分配****************************************/#includeiostreamusingnamespacestd;intk=300;constinti=100;#definen10constintj=200;voidfun(inti=1,intj=2){constintk=3;staticintl=0;char*p=newchar[n+1];for(intm=0;mn;m++)p[m]='A'+m;p[m]='\0';coutAdddressofparametervariable:endl;123456789101112131415161718196.1.3变量在内存中的存储常变量(常量)、全局变量、局部静态变量、字符串常量在程序运行前在数据区进行分配。并且依次按照常变量、全局变量、局部静态变量的顺序从低地址向高地址分配。常变量按定义的先后次序分配,全局变量、局部变量也一样。C++语言程序设计教程第6章C++程序的结构cout&i=&i\t&j=&jendl;coutAdddressoflocalvariable:endl;cout&k=&k\t&p=&p\t&m=&mendl;coutAdddressofstaticlocalvariable:endl;cout&l=&lendl;coutAddressofheap:(void*)pendl;coutbeforedeletep=pendl;delete[]p;coutafterdelete:(void*)pendl;coutp=pendl;}intmain(){L1:fun();L2:coutAdddressofglobalvariable:endl;cout&i=&i\t&j=&j\t&k=&kendl;coutAddressoffunction:endl;cout&fun=&fun\t&main=&mainendl;return0;}2021222324252627282930313233343536373940运行结果:Addressofparametervariable:&i=0013FF2C&j=0013FF30Addressoflocalvariable:&k=0013FF20&p=0013FF1C&m=0013FF18Addressofstaticlocalvariable:&l=0047773CAddressofheap:00480410//释放堆空间前指针的值beforedeletep=ABCDEFGHIJ//释放堆空间前堆中的内容afterdelete:00480410//释放堆空间后指针的值不变p=葺葺葺葺葺葺葺?//释放堆空间后,堆中的内容无意义Addressofglobalvariable:&i=0046C01C&j=0046C020&k=00474DC0Addressoffunction:&fun=004010A0&main=0040123F6.1.2变量的存储类型C++语言程序设计教程第6章C++程序的结构6.1.2变量的存储类型解释:当函数被调用时才为函数的形参、返回代码地址、局部变量分配空间。由于空间在栈中,所以从栈底开始依次按形参、返回代码地址、局部变量的顺序从高地址向低地址分配。其中,在分配形参地址时,按从右向左的顺序;分配各局部变量的地址时,按定义的先后次序。当函数调用结束,该函数占用的栈空间收回。收回的顺序(即各变量消失的顺序)与分配的顺序相反。程序运行时,系统为各个函数的执行代码在代码段中分配空间,然后将代码调入内存。各函数在代码区的排列次序按函数定义的先后次序。程序运行结束,程序占用的代码段空间收回。全局常变量、全局变量、局部静态变量、字符串常量在程序运行前在全局数据区进行分配。并且依次按照全局常变量、全局变量、局部静态变量的顺序从低地址向高地址分配,其中各类变量按定义的先后次序分配。当程序运行结束后,各全局变量的空间被系统收回,收回的顺序与分配的顺序相同,即:先分配先收回。堆空间不是系统为程序自动分配的,它是程序执行过程中由new语句为变量分配的。即使指向堆空间的指针变量消失,new语句分配的空间也不会消失。New语句分配的空间由delete语句释放。变量的生存期为从产生到消失的时期。全局变量、静态变量、常变量生存周期为整个程序的生存周期,因此称为静态生存期;局部变量的生存周期起于函数调用,结束于函数调用结束,其生存期是动态的,因此称为动态生存期。C++语言程序设计教程第6章C++程序的结构地址栈顶0013FF18mp局部变量k0013FF240013FF80栈区0013FF28004018F1函数的返回地址0013FF2Cij函数的形参栈底004010A0voidfun(){p=newchar[n+1];for(intm=0
本文标题:C++语言程序设计教程(第二版)清华出版 杨进才第6章 C++程序的结构
链接地址:https://www.777doc.com/doc-3262993 .html