19全局变量详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1体会“值传递”与“地址传递”的不同设计一个子函数1、要求:用简单变量做参数求两数中最大值,并在主函数中按从大到小的顺序输出。2、要求:用数组元素做参数求两数中最大值,并在主函数中按从大到小的顺序输出。3、要求:用数组名做参数求两数中最大值,并在主函数中按从大到小的顺序输出。2变量的作用域局部变量与全局变量形参变量只在函数调用期间才分配内存空间,调用结束立即释放,形参变量只在函数内才有效,离开该函数就不能再使用了,这种变量有效性的范围叫变量的作用域。3局部变量与全局变量1、局部变量下列变量是局部变量:a、在一个函数内部定义的变量floatf1(intn){inti,j;……}charf2(floatx,floaty){floatz;……}voidmain(){inta,b,c;……}i,jza,b,c一、变量的作用域4局部变量与全局变量1、局部变量下列变量是局部变量:a、在一个函数内部定义的变量floatf1(intn){inti,j;……}charf2(floatx,floaty){floatz;……}voidmain(){inta,b,c;……}b、函数的形式参数nx,y一、变量的作用域5局部变量与全局变量voidmain(){inta,b,c;……{intd;……d=a+b;……}}d1、局部变量下列变量是局部变量:a、在一个函数内部定义的变量b、函数的形式参数一、变量的作用域c、在某个复合语句中定义的变量1)局部变量只在自己的范围内有效局部变量的有效范围:6局部变量与全局变量1、局部变量下列变量是局部变量:a、在一个函数内部定义的变量b、函数的形式参数c、在某个复合语句中定义的变量局部变量的有效范围:1)局部变量只在自己的范围内有效一、变量的作用域floatf1(intn){inti,j;……}charf2(floatx,floaty){floatz;……}voidmain(){inta,b,c;……}nx,y7局部变量与全局变量1、局部变量下列变量是局部变量:a、在一个函数内部定义的变量b、函数的形式参数c、在某个复合语句中定义的变量局部变量的有效范围:1)局部变量只在自己的范围内有效一、变量的作用域floatf1(intn){inti,j;……}charf2(floatx,floaty){floatz;……}voidmain(){inta,b,c;……}i,jza,b,c8局部变量与全局变量2)如果局部变量的有效范围有重叠,则有效范围小的优先voidmain(){inta,b,c;a=1;b=1;c=1;……{intc;……c=a+b;printf(“%d”,c);}……printf(“%d”,c);}c1、局部变量下列变量是局部变量:a、在一个函数内部定义的变量b、函数的形式参数c、在某个复合语句中定义的变量局部变量的有效范围:1)局部变量只在自己的范围内有效一、变量的作用域9局部变量与全局变量2、全局变量在函数之外定义的变量(外部变量)是全局变量。全局变量的有效范围是:从定义变量的位置开始到源文件结束intp=1,q=5;floatf1(inta){intb;....}intf2(inta){intb;....}voidmain(){intm,n;....}p,q1、局部变量一、变量的作用域10局部变量与全局变量说明:1、利用全局变量可以在函数间传递数据。例8-13:有10个学生的学习成绩,求平均分、最高分和最低分。分析:用一个函数返回三个数据,除了用函数值外,可借助于全局变量。#includestdio.hfloatmax=0,min=0;floataverage(floatscore[],intn){inti;floatsum=score[0];max=min=score[0];for(i=1;in;i++){sum=sum+score[i];if(maxscore[i])max=score[i];if(minscore[i])min=score[i];}returnsum/n;}voidmain(){floatavg,score[10];inti;for(i=0;i10;i++)scanf(%f,&score[i]);avg=average(score,10);printf(Max:%fMin:%fAverage:%6.2f\n,max,min,avg);}2、全局变量1、局部变量一、变量的作用域11局部变量与全局变量说明:1、利用全局变量可以在函数间传递数据。2、应尽量少使用全局变量。3、如果全局变量与局部变量同名,则局部变量优先。#includestdio.hinta=3,b=5;Intmax(inta,intb){intc;c=ab?a:b;returnc;}voidmain(){inta=8;printf(“%d\n”,max(a,b));}1、占用存储单元2、降低了通用性3、降低了清晰性同名问题2、全局变量1、局部变量一、变量的作用域12变量的存储类别二、变量的动态存储和静态存储全局变量与局部变量变量的作用域:静态和动态存储方式变量的生存期:①程序区②静态存储区:编译时分配空间③动态存储区:执行时分配空间变量的属性数据类型:如:int、float存储类别自动型auto静态型static寄存器型register外部型extern全局变量1、形式参数2、自动变量3、现场保护和返回地址13变量的存储类别二、变量的动态存储和静态存储1)局部变量的存储类别1、自动变量存储在动态存储区,用auto说明通常,将auto省略如:intfunc(inta){autointb,c=3;....}形参a,变量b、c都是自动变量,调用该函数时,系统给它们分配存储空间,函数调用结束时自动释放存储空间自动变量是在调用时赋初值,每调用一次,重新赋一次初值。14变量的存储类别二、变量的动态存储和静态存储1)局部变量的存储类别1、自动变量2、静态局部变量例8-14:打印1到5的阶乘#includestdio.hfloatfac(intn){staticfloatf=1;f=f*n;returnf;}voidmain(){intj;for(j=1;j=5;j++)printf(%d!=%.0f\n,j,fac(j));}①静态局部变量属于静态存储类型。在程序整个运行期间都不释放存储空间②静态局部变量在编译时赋初值一次,下次调用函数时,这些变量保留上次调用结束时的值。③如果定义静态局部变量时没有赋初值,编译时会自动赋初值。④静态局部变量只能在定义它的函数内被引用(它存在但不能被其它函数使用)15变量的存储类别二、变量的动态存储和静态存储1)局部变量的存储类别1、自动变量2、静态局部变量例8-14e:打印1到5的阶乘#includestdio.hfloatfac(intn){staticfloatf=1;f=f*n;returnf;}voidmain(){intj;for(j=1;j=5;j++)printf(%d!=%.0f\n,j,fac(j));}①静态局部变量属于静态存储类型。在程序整个运行期间都不释放存储空间②静态局部变量在编译时赋初值一次,下次调用函数时,这些变量保留上次调用结束时的值。③如果定义静态局部变量时没有赋初值,编译时会自动赋初值。④静态局部变量只能在定义它的函数内被引用(它存在但不能被其它函数使用)16变量的存储类别二、变量的动态存储和静态存储1)局部变量的存储类别1、全局变量是静态的2、用extern说明一个在其它源文件中定义的全局变量2)全局变量的存储类别3、用static说明一个不能在其它源文件中引用的全局变量1、自动变量2、静态局部变量3、寄存器变量17变量的存储类别二、变量的动态存储和静态存储1)局部变量的存储类别1、变量的定义方法:2)全局变量的存储类别四、存储类别小结[存储类别]数据类型变量名…2、变量的划分:按作用域:自动变量静态局部变量寄存器变量形式参数全局变量局部变量按生存期:动态存储静态存储自动变量寄存器变量形式参数静态局部变量全局变量按存放位置:动态存储区静态存储区寄存器自动变量形式参数静态局部变量全局变量寄存器变量183、变量的作用域和生存期定义全局变量af1函数{定义自动变量b……}f2函数{定义局部静态变量c……调用f1……}voidmain函数{……调用f1……调用f2……}a的作用域b的作用域c的作用域mainf1mainf2f1f2main程序的执行a的生存期b的生存期c的生存期程序开始程序结束19函数内函数外变量的存储类别作用域存在性作用域存在性自动变量和寄存器变量√√××局部静态变量√√×√全局变量√√√√变量的存储类别小结20局部变量和全局变量作用范围举例xt03:#includestdio.hinta,b;/*a,b为全局变量*/voidf1(intx){intt1,t2,a;/*t1,t2,a为局部变量*/a=t1=x*4;t2=b*3;b=10;printf(“f1:t1=%d,t2=%d,a=%d,b=%d\n”,t1,t2,a,b);}main(){a=2;b=4;/*此a,b是为全局变量赋值*/f1(a);/*调用函数f1()*/printf(“main:a=%d,b=%d”,a,b);}将a删除,程序运行结果是什么?全局变量与局部变量同名时,局部变量起作用,全局变量被屏蔽,应小心使用21局部静态变量与局部自动变量应用实例xt04fun(){inta=2;/*默认为auto自动变量*/staticintb=4;a=a+2;b+=2;printf(a=%db=%d\n,a,b);}main(){fun();fun();fun();}a=4b=6a=4b=8a=4b=10xt05longfun(intn){staticlongt=1;t=t*n;return(t);}main(){intn=7,i;for(i=1;i=n;i++)printf(%ld,fun(i));}局部静态变量:分析下面程序的功能:22voidf1(){intt=2;a*=t;b/=t;}main(){inta,b;printf(“Entera,b:”);scanf(“%d,%d”,&a,&b);f1();/*调用函数f1()*/printf(“a=%d,b=%d”,a,b);}看一个例子,错在那里?编译程序会提示出错:Undefinedsymbol‘a’和Undefinedsymbol‘b’。为什么?因为main中定义的a,b在f1()不能使用。如何修改?voidf1(){inta,b,t=2;/*a,b是随机值*/a*=t;b/=t;}程序运行结果是什么?输入1,2输出a=1,b=223内部函数与外部函数一、内部函数内部函数只能被所在源文件中的其他函数调用二、外部函数外部函数不仅能被所在源文件中的函数调用,而且能被其他源文件中的函数调用外部函数用extern说明,也可以省略extern在需要调用此函数的文件中,用extern声明内部函数用static说明24内部函数与外部函数例8-15有一个由若干字符组成的字符串,设计一个程序删除字符串中的某个字符。文件1:Ex08_15A.C#includestdio.hexternvoidentstr(charstr[]);externvoiddelstr(charstr[],charch);externvoidprnstr(charstr[]);voidmain(){charc,str[80];entstr(str);scanf(%c,&c);delstr(str,c);prnstr(str);}文件2:Ex08_15B.C#includestdio.hvoidentstr(charstr[]){gets(str);}voidprnstr(charstr[]){printf(%s\n,str);}文件3:Ex08_15C.Cvoiddelstr(charstr[],charch){int

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功