您好,欢迎访问三七文档
复习:1.数组作函数参数有几种形式?2.何为局部变量?何为全局变量?它们的作用范围是什么?1.数组元素作实参:与变量做实参一样,是单向传递---即“值传送”方式。用数组名作函数参数:实参与形参都用数组名,传递整个数组不是“值传送”,而是“地址传送”—相当于双向传递。2。局部变量:在函数内定义,在本函数范围内有效。全局变量:在函数外定义。作用范围是从定义变量的位置开始到本源文件结束。用途:全局变量在整个文件各函数中都可以用。因此,当所调用函数结束时,该值还保留,主函数中将用它代替返回值。intZxgbs;voidmain(){intzdgy(intm,intn);intm,n,zdgys;printf(inputm,n\n);scanf(%d,%d,&m,&n);zdgys=zdgy(m,n);printf(zdgy=%d,zxgb=%d,zdgys,Zxgbs);}intzdgy(intm,intn){intt,k,i;if(mn)t=n;elset=m;for(i=1;i=t;i++){if(m%i==0&&n%i==0)k=i;}Zxgbs=m*n/k;return(k);}作业7-5求最大公约最小公倍函数:charmax_s(charst[30])将st[0]为标杆赋给max;将max循环与各元素比较,大则给max;返回max.主函数:定义变量,输入数组;调用函数求最大字符;输出最大字符。练习:向一个字符数组中输入若干(30以内)个字符,调用一个求数组最大值函数,输出最大字符。循环条件:st[i]!=‘\0’voidmain(){charmax_s(charst[30]);charstr[30];printf(Inputstring:\n);scanf(%s,str);/*gets(str)*/printf(max=%c\n,max_s(str));}charmax_s(charst[30]){inti;charm;m=st[0];for(i=0;st[i]!='\0';i++)if(mst[i])m=st[i];returnm;}数组名代表数组首地址调用该函数时实参用数组名8.9动态存储变量与静态存储变量目的:掌握变量的存储分类和存储方式以及动态存储与静态存储在使用上的不同:重点:局部变量与全局变量的不同存贮方式及使用。8.9.1变量的存储类别从变量的作用域来分。可分为全局变量和局部变量。从变量值存在的时间分,可以分为静态存储变量和动态存储变量。1。静态存储变量:在程序运行期间分配固定的存储空间的方式。3。在存储空间中,在供用户使用的用户区域里分成三个区:(1)程序区--放用户程序(2)静态存储区--放用户区①全局变量:程序执行时分配程序区固定的存储单元,结束释放。静态存储区②用static说明的局部变量。动态存储区(3)动态存储区--放①函数的形参。②自动变量(未用static说明的局部变量)。③函数调用时的现场保护和返回地址等。2。动态存储变量:在程序运行期间,动态分配存储空间的方式。静态存储区数据是存放在固定的存储单元中。动态存储区的数据则是不固定的,需要实时分配空间,用毕后释放,下次再重新分配。如:同一变量调用多次时,所占的单元地址很可能不同。4。C中的变量和函数都有两种属性数据类型:整型、实型、字符型等。数据存储类别:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。’redzist8.9.2局部变量的存储方式:局部变量允许有三种存储方式:①动态局部变量--自动变量。②静态局部变量③寄存变量1。自动变量(动态局部变量)未用static定义的局部变量为自动变量(auto)。以前用的局部变量如:intx,charc等都属于这种类型。intx与autointx等价。这种变量存储在动态存储区,由系统自动分配和释放存储空间。2.*静态局部变量--保留值的局部变量在局部变量前加stadic的变量为静态局部变量。(如:staticintx;)它既只能用于定义的函数中,又具有其值保留的特点。函数调用后,其值并不取消,下次调用时,该值就是本次调用的初值。这种变量存储在静态存储区。voidmain(){inta=2,i;for(i=0;i3;i++)printf(“%d”,f(a));}bca1.开始:032结束:142→72次开始:042结束:152→8052第三次1629结果:789例1(书例8.17)intf(inta){autointb=0;/*同intb=0;*/staticintc=3;b=b+1;c=c+1;return(a+b+c);}(2)虽然静态局部变量在调用结束时存在,但其它函数不能引用。因它是局部的。(3)静态局部变量占内存多,多次调用不易弄清其值,不要多用静态局部变量。说明:(1)当要保留上次调用值时,可用静态局部变量。3寄存变量:(了解)用register说明存放在寄存器中的变量.特点:执行速度快。当运算时,需要多次调用同一变量(如求1~10000的和,用s=s+i,i要循环10000)若用自动变量存取变量的值要化很多时间。若用运算器的寄存器(运算器中临时存放数据的设备)中,即可大大提高执行速度。registerinti;8.9.3用extern声明外部(全局)变量*外部变量在函数外定义;编译时,分配静态存储区;一般可被程序中从定义开始后的各函数引用。1。在一个文件内声明外部变量在某函数中要引用一个外部变量,而它还未定义,该函数中必须用eatern说明,可扩展其作用域。例3:intX=123;voidmain(){printf(“x=%d,y=%d\n”,X,Y);}intY=200;编译时会出错,因使用Y时未定义,应在printf前加一名外部变量的说明,externintY。←加externintY;一般外部变量在用它之前定义,使用时可不声明。2。在多个文件内声明外部变量(1)外部(全局)变量的两种作用范围(引用形式)C中一个源程序文件的函数能否引用另一文件中某函数的全局变量?有两种情况:一种是用extern说明后,可引用;一种是用static说明后,不能引用。(1)用extern声明,可在需要引用的文件中使用,使之成为非静态外部变量,扩展了全局变量的作用域。例4(例8.21)给定b的值,输入A和m,求A*b和Am的值,将求Am的函数放另一文件。(file1.c,file2.c)intA;voidmain(){intb=3,c,d,m;printf(“输入A和m的值:”);scanf(“%d,%d”,&A,&m);c=A*b;d=power(m);printf(“c=%d,d=%d”,c,d);}file2.c的内容(求An)externintA;/*用extern声明:因在另一文件*/intpower(intn)/*定义要在函数外声明*/{inti,t=1;for(i=1;i=n;i++)t=t*A;returnt;}文件名可含盘符、路径filel.c文件:#include“file2.c”/*将file2.c包含到file1.c中*/(2)用static说明,限定只能被本文件中函数引用--静态外部变量。方法:在外部变量前加static说明。在外部加static后,该变量只能在本文件中使用。而不能再被其它文件的函数调用。如上例中若在main()前定义:staticintA;即使在file2.c中使用了externintA,也不允许使用外部变量A.3。外部变量只能定义一次,但可多次声明,原则上在函数引用外部变量时应声明。8.9.4存储类别与变量类别的总结:1.存储类别与数据类型是变量的基本属性。可通过两个关键字说明:(1)staticinta;--声明静态局部或外部变量.(2)autointa;(同inta)--定义自动变量(在函数内定义)。(3)registerinta--定义寄存器变量(在函数内定义)。(4)externinta--声明a是被定义过的外部变量。(在函数外声明)。2.变量类别总结:自动变量(auto),即动态局部变量(离开函数,值消失)静态局部变量(离开函数,值仍保留)寄存器变量(离开函数,值消失)静态外部变量(static)(限本文件引用)外部变量(非静态外部变量,允许其它文件引用)局部变量全局变量(1)从作用域分:用extern说明后,可引用(2)从变量存在的时间分:自动变量(本函数内有效)形参寄存器变量(本函数内有效)静态局部变量(函数内有效)静态外部变量(本文件内有效)外部变量(其它文件可引用)动态存储静态存储(3)从变量值存放的位置分:内存中动态存储区:自动变量、形参CPU的寄存器:寄存器变量。注意:static对局部变量和全局变量的作用不同。对局部使之变为静态,对全局变量使之变为局部,即只在本文件内起作用。静态局部变量内存静态存储区静态外部变量(函数外部静态变量)外部变量(可为其它文件引用)8.10内部函数和外部函数根据函数能否被其它源文件调用,将函数分为内部函数和外部函数。8.10.1内部函数一个函数只能被本文件中其它函数所调用的函数。方法:在定义函数时,前面加static.static类型函数名(形参表)如:staticintfun(inta,intb)内部函数又称为静态函数,使用它可以使函数局限在所在的文件内,如果在不同的文件中有同名的内部函数,互不干扰。8.10.2外部函数若省extern隐含为外部函数.以前定义的函数均为外部的。只要不在函数前加static均看成外部函数。例5(8.22):现有一个字符串,输入一个字符,将该串中的该字符删去。用外部函数实现。分析:将输入字符串函数:enter_string()和删除字符串函数:del_string(),分别放在两个文件中。一般C中的函数都是外部(全局)函数,即一个函数可被本文件或其它文件中的函数调用。形式:externintfun(inta,intb),与intfun(inta,intb)同ltf1.c(文件1,放主函数)voidmain(){externvoidenter_string(charstr[80]);externvoiddel_string(charstr[],charch);charc,str[80];enter_string(str);i=0scanf(“%c”,&c);abcstrs\0delete_string(str,c);printf(“%s”,str);abctr\0}j=0extern可不写做法同以前基本相同,函数可放另一文件中ltf2.c(文件2)voidenter_string(charstr[80])/*定义外部函数*/{gets(str);}/*声明要调其他文件的函数*/文件1前用预处理命令将后两文件包含既可运行#include“ltf2.c”,#include“ltf3.c”ltf3.c(文件3)voiddel_string(charstr[],charch)/*定义外部函数*/{inti,j;for(i=j=0;str[i]!=‘\0’;i++)__________________/*不是要删的字符放数组中*/__________________/*将str[i]赋给str[j],j再加1*/str[j]=‘\0’;/*跳出循环后串尾加‘\0’*/}i=0abcstrs\0abctr\0j=0if(str[i]!=ch)str[j++]=str[i];在lt2f1.c中#include”ltf2.c”#include”ltf3.c”voidmain(){…….}8.11.1用TurboC集成环境:例6。运行上例(有三个文件)。1。将file1.c、file2.c、file3.c编辑存盘。2。建立“项目文件”:file1.cfile2.cfile3.c以.prj为扩展名存盘,如:file.prj.3。按F9编译连接,生成file.exe目标文件。4。按Ctrl+F9运行。*8.11.2
本文标题:c语言教案 10
链接地址:https://www.777doc.com/doc-3377416 .html