您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > C程序设计08-变量的作用域及存储类别
第1页第八章变量的作用域和存储类别主要内容变量的作用域一同名变量的辨析二变量的存储类别和生存期三变量作用域和生存期小结四第2页第一节变量的作用域局部变量12本节主要内容全局变量33第3页变量的作用域:允许使用变量的区域依照变量作用域的不同,可以把变量分为两种:变量全局变量局部变量第一节变量的作用域第4页局部变量:在大括号内定义的变量局部变量的作用域:局部变量只能在定义它的括号内使用,其作用范围不能向括号外渗透(可以向内层括号中渗透)。在函数体开头定义的,在本函数内有效在复合语句中定义的,则只在复合语句中有效8.1.1局部变量第5页8.1.1局部变量intmain()/*指出程序中的错误*/{inta,b;scanf(“%d%d”,&a,&b);{intc;c=a+b;}printf(“c=%d\n”,c);printf(“a=%d,b=%d\n”,a,b);return0;}错误!应移入复合语句内移入复合语句内,可否?第6页说明:即便是在主函数中定义的变量,也不能被其它函数使用形式参数也是局部变量(与函数内定义的相同)不同函数中定义的变量可以同名,但表示的不是同一变量,它们在内存中占用不同的单元8.1.1局部变量第7页8.1.2全局变量m,n的作用域x,y的作用域全局变量:在函数外定义的变量,又叫外部变量全局变量的作用域:从定义处到源文件结束如:intx,y;/*定义在函数外*/intmain(){……}f1(){……}intm,n;/*定义在函数外*/f2(){……}f3(){……}第8页8.1.2全局变量全局变量的作用域可以扩展(1)在本源文件中扩展,如:intx,y;externm;/*变量声明,可以不写类型*/intmain(){……}f1(){……}intm,n;f2(){……}f3(){……}扩展后m的作用域m原本的作用域第9页8.1.2全局变量全局变量的作用域可以扩展(2)扩展到其他源文件,如:m的作用域//源文件2externm;intf4(){……}floatf5(){……}voidf6(){……}//源文件1intx,y;intmain(){……}f1(){……}intm,n;f2(){……}f3(){……}第10页8.1.2全局变量全局变量的作用域可以扩展(3)如果不想让其他源文件使用,可以在定义时加上static进行限制//源文件2externm;intf3(){……}voidf4(){……}voidf5(){……}//源文件1staticintm;intmain(){……}voidf1(){……}intf2(){……}//源文件3intm;floatf6(){……}voidf7(){……}intf8(){……}第11页8.1.2全局变量全局变量的作用:给多个函数提供一个公共场所,便于函数之间交换数据全局变量的适用场合:有些情况下,主调函数需要被调函数提供两个以上的值,如:在若干数据中找出最大值和最小值而函数只能有一个返回值第12页8.1.2全局变量voidmax_min(intx,inty){inti;for(i=x;i=x*y;i+=x)if(i%y==0){min=i;break;}max=x*y/min;}#includestdio.hintmax,min;voidmax_min(int,int);intmain(){inta,b;scanf(“%d%d”,&a,&b);max_min(a,b);printf(“%d,%d\n”,max,min);return0;}求两个数的最小公倍数和最大公约数第13页8.1.2全局变量全局变量的优缺点:优点:一个函数将值放入全局变量,其他函数都可以使用,从而增加了函数间的联系缺点:占内存时间长函数之间互相影响,增加了函数间耦合性除非必要,一般不用全局变量问题:全局变量可否作参数?第14页第二节同名变量的辨析局部变量和全局变量同名时的分辨inta=1,b=2,c=3,d=4;intmain(){inta,b;a=4;/*局部变量*/b=5;/*局部变量*/c=6;/*全局变量*/if(ab){intc;c=a;/*c是复合语句级,a是函数级*/a=b;/*a,b都是函数级*/b=d;/*b是函数级,d是全局*/}……}第15页第三节变量的存储类别和生存期内存区域的划分123本节主要内容3局部变量的种类333全局变量的种类第16页第三节变量的存储类别和生存期内存区域的划分123本节主要内容3局部变量的种类333全局变量的种类第17页8.3.1内存区域的划分堆区代码区非零区零区栈区动态存储区静态存储区全局变量静态局部变量自动变量函数形参临时变量第18页第三节变量的存储类别和生存期内存区域的划分123本节主要内容3局部变量的种类333全局变量的种类第19页8.3.2局部变量的种类局部变量根据生存期不同,又分为局部自动变量和局部静态变量局部自动变量的数据可以存放在内存中,也可以存放在寄存器中,存放在寄存器中的称为寄存器变量局部变量寄存器变量register局部自动变量auto局部静态变量static第20页8.3.2局部变量的种类局部自动变量例:intf(inta,intb)/*局部自动变量*/{autointc;/*auto可省*/c=a+b;……}第21页8.3.2局部变量的种类局部自动变量的特点:动态存储:需要时才开辟空间,用完即释放,若再用,需要重新开辟赋初值次数与开辟空间次数相等:若变量定义时赋了初值,则每次开辟空间时都要存入初值若定义变量时无初值,则其值不确定第22页8.3.2局部变量的种类voidf(){inta=1,b;……}intmain(){f();f();return0;}内存1a1a?b?b第23页8.3.2局部变量的种类局部静态变量voidf(){staticintn=0;/*局部静态变量*/n++;printf(“第%d次调用\n”,n);……}第24页8.3.2局部变量的种类voidf(){staticintn=0;n++;printf(“第%d次调用\n”,n);}intmain(){inti;for(i=1;i=2;i++)f();return0;}内存0n?i12123第1次调用第2次调用屏幕输出:执行过程:第25页8.3.2局部变量的种类局部静态变量的特点:静态存储:程序开始时开辟空间,用完不释放,以备后用,整个程序结束时再释放(只开辟一次,也只释放一次)保留数据:第一次调用函数时留下的数据,第二次可以继续用……若有初值,只赋一次若变量定义时赋了初值,则开辟空间时存入初值,且仅此一次若定义变量时无初值,则系统自动置0模式作用范围仅限于定义它的括号内适用场合:函数调用时存的数据需要保留到下次调用第26页8.3.2局部变量的种类寄存器变量:voidf(inta,intb){registerinti;/*寄存器变量*/……}寄存器变量的特点:变量的值存放在系统分配的寄存器中,可减少变量存取时的时间开销第27页8.3.2局部变量的种类寄存器变量的适用场合:对运行速度要求高的程序中系统对寄存器变量的限制:只有局部自动变量和形参可定义为寄存器变量寄存器变量的数目不能太多,若非必要一般不用微机上,编译器一般将寄存器变量当作自动变量处理原因:寄存器数目有限第28页第三节变量的存储类别和生存期局部变量和全局变量123本节主要内容3局部变量的种类333全局变量的种类第29页8.3.3全局变量的种类全局变量根据作用域不同,又分为两种:全局变量一般全局变量externstatic型全局变量static存储类型:都是静态存储,程序运行之前开辟空间,程序结束才释放初值:若不赋初值,其值都为0文件级程序级第30页8.3.3全局变量的种类一般全局变量(用extern说明或省略)作用域可在本源文件内扩展:如:intx,y;intmain(){……}externm;f1(){……}intm,n;f2(){……}m原本作用域m现在作用域第31页8.7.3全局变量的种类一般全局变量(程序级)作用域还可扩展到其它源文件:intmain(){……}intm,n;f1(){……}f2(){……}externm,n;voidf1(){……}…………源文件1源文件2m,n作用域第32页8.7.3全局变量的种类static型全局变量(有些教材称做静态全局变量)作用域只能在本源文件内扩展:如:intmain(){……}externm;f1(){……}staticintm,n;f2(){……}n的作用域m的作用域第33页8.7.3全局变量的种类static型全局变量(文件级)作用域只能在本源文件内扩展:externm,n;intmain(){…………}intm,n;voidf1(){……}…………staticintm,n;voidf2(){……}…………源文件3源文件2源文件1第34页第四节变量作用域和生存期小结全局变量存储类型生存期作用域初值空间分配空间释放本文件中(变量定义之后)本文件中(变量定义之前)其他源文件中extern(可省)静态main函数执行前main函数结束时无条件使用声明后方可用声明后方可用若不赋初值其值为0static静态main函数执行前main函数结束时无条件使用声明后方可用不可用若不赋初值其值为0局部变量存储类型生存期作用域初值空间分配空间释放定义它的大括号内定义它的大括号外其他文件或函数中auto(可省)动态需要时分配用完即释放可用不可用不可用若不赋初值其值不确定static静态main函数执行前main函数结束时可用不可用不可用若不赋初值其值为0register动态需要时分配用完释即放可用不可用不可用若不赋初值其值不确定第35页习题intmain(){floatx,y;scanf(“%f,%f”,&x,&y);max(floatx,floaty);printf(“%f\n”,m);return0;}floatmax(floatx,floaty);{floatx,y;floatm;if(xy)m=x;elsem=y;}找出下面程序中的错误:第36页练习及作业inttest(){intx=0;staticinty=5;y+=++x;returnx+y;}intmain(){test();printf(“%d\n”,test());return0;}下面程序的运行结果各是什么?第37页习题习题8:全部
本文标题:C程序设计08-变量的作用域及存储类别
链接地址:https://www.777doc.com/doc-3379735 .html