欢迎来到天天文库
浏览记录
ID:59832129
大小:299.81 KB
页数:21页
时间:2020-11-24
《全局变量及其作用域和生存期函数的存储分类.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第19讲全局变量及其作用域和生存期函数的存储分类8.3全局变量及其作用域和生存期全局变量只有静态一种类别,放在静态存储区。1.全局变量的作用域和生存期全局变量是可以在函数外部任意位置上定义的变量,它的作用域是从定义点到整个源文件结束。说明:(1)全局变量为函数之间的数据传递提供了一条通道。由于同一文件的所有函数都能引用全局变量的值,如果在一个函数中改变了某全局变量的值,就能影响使用该全局变量的其它函数,相当于各个函数间有了直接传递的通道。(2)全局变量的生存期是整个程序的运行期间,即“长期”。(3)若全局变量与某一函数中的局部变量同名,则在该函数中,全局变量被屏蔽,使用局部变量。i
2、ntmax,min;floatf(inta[10]){inti,sum=a[0];floataver;max=a[0];min=a[0];for(i=1;i<10;i++){sum=sum+a[i];if(a[i]>max)max=a[i];if(a[i]3、verage);}例8.4编一函数求出10个整数的最大值、最小值和平均值。intsum;voidfun(void);main(){sum=10;printf("**main(1)**:%d",sum);fun();printf("**main(2)**:%d",sum);}voidfun(void){intsum;sum=20;printf("**fun**:%d",sum);}运行结果为:**main(1)**:10**fun**:20**main(2)**:10例8.5全局变量与局部变量同名问题。虽然全局变量的作用域大,生存期长,用起来似乎方便灵活,但除十分必要外,4、一般不提倡使用全局变量。主要有以下原因:1.长期占用存储空间。2.影响了函数的独立性,不便于移植。3.人在读程序时,难以确定某一时刻的当前值。全局变量sum在fun函数中不起作用。2.全局变量作用域的扩展(1)当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,使其作用域从extern说明处起,延伸到该函数末尾。也可将extern写在函数之外,使其作用域延伸至文件末尾。(2)当一个程序由多个文件组成时,每个文件都是一个独立的编译单位。如果多个文件中都需要用同一个全局变量,这时若在每个文件中都定义一个同名的全局变量,则单独编译各个文件时不会5、产生错误,编译程序将按定义分别为它们分配存储空间;但当连接时,将产生同一变量的重复定义的错误。解决办法是:在其中一个文件中定义的全局变量,在其它文件中用extern进行说明,说明这些全局变量已在某一编译单位中定义过,通知编译程序不必再为它们开辟存储单元,只是将作用域进一步扩展到本编译单位中。main(){voidgx(),gy();externintx,y;……gx();gy();……}voidgx(){……}intx,y;voidgy(){……}x,y的原作用域扩展后新增的作用域externintx,y;main(){……}voidgx(){……}intx,y;voidgy(){6、……}x,y的作用域扩展后x,y的作用域例:在同文件中扩展全局变量的作用域书印错!/*file1.c*/intx,y;main(){……f1();f2();f3();……}f1(){x=111;……}x,y的作用域/*file2.c*/externintx;f2(){printf(“%d”,x);/*111*/……}f3(){x++;printf(“%d”,x);/*112*/……}例:在不同文件中扩展全局变量的作用域扩展后x的作用域3.不允许扩展其作用域的全局变量(静态全局变量)当定义全局变量时,若加上static,则称为静态全局变量,其作用域仅限于本编译单位(本文件)。7、/*file1.c*/staticintn;voidf();main(){……f();}/*file2.c*/externintn;voidf(){……}注意:static对局部变量和全局变量的作用效果不同。对局部变量:作用域没变,存储类改为静态;对全局变量:存储类没变,作用域仅限于本文件(小全局)。n的作用域被限定死8.4函数的存储分类1外部函数当定义一个函数时,若在函数返回值的类型前加上extern(或缺省)时,称此函数为“外部”函数。它可以被同一个程序的其它文件
3、verage);}例8.4编一函数求出10个整数的最大值、最小值和平均值。intsum;voidfun(void);main(){sum=10;printf("**main(1)**:%d",sum);fun();printf("**main(2)**:%d",sum);}voidfun(void){intsum;sum=20;printf("**fun**:%d",sum);}运行结果为:**main(1)**:10**fun**:20**main(2)**:10例8.5全局变量与局部变量同名问题。虽然全局变量的作用域大,生存期长,用起来似乎方便灵活,但除十分必要外,
4、一般不提倡使用全局变量。主要有以下原因:1.长期占用存储空间。2.影响了函数的独立性,不便于移植。3.人在读程序时,难以确定某一时刻的当前值。全局变量sum在fun函数中不起作用。2.全局变量作用域的扩展(1)当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,使其作用域从extern说明处起,延伸到该函数末尾。也可将extern写在函数之外,使其作用域延伸至文件末尾。(2)当一个程序由多个文件组成时,每个文件都是一个独立的编译单位。如果多个文件中都需要用同一个全局变量,这时若在每个文件中都定义一个同名的全局变量,则单独编译各个文件时不会
5、产生错误,编译程序将按定义分别为它们分配存储空间;但当连接时,将产生同一变量的重复定义的错误。解决办法是:在其中一个文件中定义的全局变量,在其它文件中用extern进行说明,说明这些全局变量已在某一编译单位中定义过,通知编译程序不必再为它们开辟存储单元,只是将作用域进一步扩展到本编译单位中。main(){voidgx(),gy();externintx,y;……gx();gy();……}voidgx(){……}intx,y;voidgy(){……}x,y的原作用域扩展后新增的作用域externintx,y;main(){……}voidgx(){……}intx,y;voidgy(){
6、……}x,y的作用域扩展后x,y的作用域例:在同文件中扩展全局变量的作用域书印错!/*file1.c*/intx,y;main(){……f1();f2();f3();……}f1(){x=111;……}x,y的作用域/*file2.c*/externintx;f2(){printf(“%d”,x);/*111*/……}f3(){x++;printf(“%d”,x);/*112*/……}例:在不同文件中扩展全局变量的作用域扩展后x的作用域3.不允许扩展其作用域的全局变量(静态全局变量)当定义全局变量时,若加上static,则称为静态全局变量,其作用域仅限于本编译单位(本文件)。
7、/*file1.c*/staticintn;voidf();main(){……f();}/*file2.c*/externintn;voidf(){……}注意:static对局部变量和全局变量的作用效果不同。对局部变量:作用域没变,存储类改为静态;对全局变量:存储类没变,作用域仅限于本文件(小全局)。n的作用域被限定死8.4函数的存储分类1外部函数当定义一个函数时,若在函数返回值的类型前加上extern(或缺省)时,称此函数为“外部”函数。它可以被同一个程序的其它文件
此文档下载收益归作者所有