C程序设计08-变量的作用域及存储类别_第1页
C程序设计08-变量的作用域及存储类别_第2页
C程序设计08-变量的作用域及存储类别_第3页
C程序设计08-变量的作用域及存储类别_第4页
C程序设计08-变量的作用域及存储类别_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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(){……}void

f6(){……}//源文件1intx,y;intmain(){……}f1(){……}intm,n;

f2(){……}f3(){……}第10页8.1.2全局变量全局变量的作用域可以扩展

(3)如果不想让其他源文件使用,可以在定义时加上static进行限制//源文件2externm;intf3(){……}void

f4(){……}voidf5(){……}//源文件1static

intm;

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;}#include<stdio.h>intmax,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(a>b){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(){……}

static

intm,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(可省)动态需要时分配用完即释放可用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论