资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第12章,标识符的作用域和存储类,第12章,12.1,变量的作用域和生存期,1,、局部变量,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“,局部变量,”。,12.1 变量的作用域和生存期1、局部变量,float f1(int a)/*,函数,f1,*/,int b,c;,a,、,b,、,c,有效,char f2(int x,int y)/*,函数,f2*/,int i,j;x,、,y,、,i,、,j,有效,void main()/*,主函数,*/,int m,n;,m,、,n,有效,float f1(int a),主函数中定义的变量只在主函数中有效。,(2),不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。,(3),形式参数也是局部变量。,(4),在一个函数内部,可以在,复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。,主函数中定义的变量只在主函数中有效。,main(),int a=3,b=2,c=1;,c-=+b;b*=a+c;,int b=5,c=12;,c/=b*2,;,a-=c,;,printf(%d,%d,%dn,,,a,,,b,,,c),;,a+=-c;,printf(%d,%d,%dn,,,a,,,b,,,c),;,2,,,5,,,1,2,,,3,,,-2,main()2,5,1,2,、全局变量,在函数内定义的变量是局部变量,而在函数之外定义的变量称为,外部变量,外部变量是,全局变量,(,也称全程变量,),。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。,2、全局变量 在函数内定义的变量是局部变量,而在函数,int p=1,q=5;/*,外部变量,*/,float f1(int a)/*,定义函数,f1*/,int b,c;,char c1,c2;/*,外部变量,*/,char f2(int x,int y)/*,定义函数,f2*/,int i,j;,void main()/*,主函数,*/,int m,n;,int p=1,q=5;/*,有,4,个学生,,5,门课的成绩,要求输出其中的最高成绩以及它属于第几个学生、第几门课程。,例题,解题思路,除了输出最高分以外,还要输出该分数是属于第几个学生、笫几门课的信息,即需要输出,3,个结果。但是调用一个函数只能得到一个函数值,可以使用全局变量,通过全局变量从函数中得到所需要的值,有4个学生,5门课的成绩,要求输出其中的最高成绩以及它属,编写程序,#include,int Row,Column;/*,定义全局变量,Row,和,Column*/,void main(),float highest_score(float array45);,float score45=61,73,85.5,87,90,72,84,66,88,78,75,87,93.5,81,96,65,85,64,76,71;,printf(The highest score is%6.2fn,highest_score(score,);,printf(Student No.is%dnCourse No.is%dn,Row,Column);,编写程序#include,float highest_score(float array45),int i,j;float max;,max=array00;,for(i=0;i4;i+),for(j=0;jmax),max=arrayij;,Row=i;,/*,将行的序号赋给全局变量,Row*/,Column=j;,/*,将列的序号赋给全局变量,Column*/,return(max);,float highest_score(float arra,说明:,由于全局变量在整个文件范围内都有效,因此在,highest_score,函数中将行序号,i,和列序号,j,赋给全局变量,Row,和,Column,,在函数调用结束后,函数中的局部变量被释放了,但全局变量保存下来,可以在,main,函数中输出它们的值。,说明:,建议不在必要时不要使用全局变量:,全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。,使用全局变量过多,会降低程序的清晰性。在各个函数执行时都可能改变外部变量的值,程序容易出错。,建议不在必要时不要使用全局变量:全局变量在程序的全部执行,12.3,变量的存储方式和生存期,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值存在的时间角度来分,又可以分为静态存储方式和动态存储方式。,12.3 变量的存储方式和生存期 从变量的作,所谓静态存储方式是指在程序运行期间由系统,分配固定的存储空间,的方式。动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。这个存储空间可以分为三部分:,1.,程序区,2.,静态存储区,3.,动态存储区,所谓静态存储方式是指在程序运行期间由系统分配固定,在语言中每一个变量和函数有两个属性:,数据类型和数据的存储类别,存储方式分为两大类:,静态存储类和动态存储类,。,具体包含四种:,自动的(,auto,),静态的(,static,),寄存器的(,register,),外部的,(extern,)。,在语言中每一个变量和函数有两个属性:数据类型和数据,1,、,auto,变量,函数中的局部变量,如不专门声明为,static,存储类别,都是,动态,地分配存储空间的,数据存储在动态存储区中。,自动变量用关键字,auto,作存储类别的声明。,例如:,int,(,int,),*,定义,f,函数,,a,为形参,*,auto int,,;,/*,定义、为自动变量,*,1、auto变量 函数中的局部变量,如不专门声明为,2,、,static-,声明静态变量,(,1,)静态局部变量:当函数中的局部变量的值在函数调用结束后不消失而保留原值时,该变量称为静态局部变量。用关键字,static,进行声明。,2、static-声明静态变量(1)静态局部变量:当,输出到的阶乘值。,例题,解题思路,可以编一个函数用来进行一次累乘,如第,1,次调用时进行,1,乘,1,,第,2,次调用时再乘以,2,,第,3,次调用时再乘以,3,,依此规律进行下去。这时希望上一次求出的连乘值保留,以便下一次再乘上一个数。可以用,static,来指定变量不释放,保留原值。,输出到的阶乘值。例题解题思路 可以编一,#include,void main(),int fac(int n);,int i;,for(i=1;iy?x:y;,return(z);,(1)在一个文件内声明外部变量例:用extern声明外部变,(,2,)在多文件的程序中声明外部变量,#include,int,A,;/*,定义外部变量,*/,void main(),int power,(,int,);,/*,函数声明,*/,int b=3,c,m,d,;,printf,(,enter the number a and its power m:n,);,scanf,(,,,,,A,,);,A,*,;,printf,(,*,,,A,,);,power,();,printf,(,*,n,,,A,,);,(2)在多文件的程序中声明外部变量#include st,文件,file,.c,中的内容为:,extern A,;,/*,声明,A,为一个已定义的外部变量,*/,int,(,int,),;,int,,;,for,(;),*,A,;,();,文件file.c中的内容为:,12.4,作用域和生存期的小结,从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:,局部变量包括:,自动变量、静态局部变量、寄存器变量。,形式参数可以定义为自动变量或寄存器变量,全局变量包括:,静态外部变量、外部变量,12.4 作用域和生存期的小结从作用域角度分,有局部变量和全,(,2,)从变量存在的时间来区分,有动态存储和静态存储两种类型。,静态存储是程序整个运行时间都存在,,动态存储则是在调用函数时临时分配单元。,动态存储:自动变量、寄存器变量、形式参数,静态存储:静态局部变量、静态外部变量 、外部变量,(2)从变量存在的时间来区分,有动态存储和静态存储两种类型。,(4)static,对局部变量和全局变量的作用不同。对局部变量来说,它使变量由动态存储方式改变为静态存储方式。而对全局变量来说,它使变量局部化,但仍为静态存储方式。从作用域角度看,凡有,static,声明的,其作用域都是局限的,或者是局限于本函数内,或者局限于本文件内。,(4)static对局部变量和全局变量的作用不同。对局部变,12.6,内部函数和外部函数,根据函数能否被其他源文件调用,将函数区分为,内部函数,和,外部函数,。,12.6.1,内部函数,如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加,static,。即,static,类型标识符 函数名,(,形参表,),例如,:,static int fun(int a,int b),12.6 内部函数和外部函数 根据函数能否被其他源文件调用,12.6.2,外部函数,(1),定义函数时,如果在函数首部的最左端加关键字,extern,则表示此函数是外部函数,可供其他文件调用。如果在定义函数时省略,extern,则隐含为外部函数。,(2),在需要调用此函数的文件中,用,extern,对函数作声明,表示该函数是在其他文件中定义的外部函数,12.6.2 外部函数(1)定义函数时,如果在函数首部的,有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。,例题,解题思路,对,str,数组的字符逐个检查,如果不是被删除的字符(设删除空格)就将它存放在数组中,.,有一个字符串,内有若干个字符,今输入一个字符,要求程序将,File.c,(文件),#include,void main(),extern void enter_string(char str);,extern void detele_string(char str,char ch);,extern void print_string(char str);,*,以上,3,行声明在本函数中将要调用的在其他文件中定义的,3,个函数,*,char c;,char str80;,scanf(%c,detele_string(str,c);,print_string(str);,编写程序,File.c(文件)编写程序,file,.c,(文件),#include,void enter_string(char str80),gets(str);,*,向字符数组输入字符串,*,File3.c,(文件),void delete_string(char str,char ch),*,定义外部函数,delete_string*,int i,j;,for(i=j=0;stri!=0;i+),if(stri!=ch),strj+=stri;,stri=0;,file.c(文件),file,.c,(文件),#include,void print_string(char str),printf(%sn,str);,运行情况如下:,(,输入),(输入要删去的字符),(输出已删去指定字符的字符串),file.c(文件)运行情况如下:,本章小结,1.,在,C,语言中,函数是用来完成某一个特定功能的。,C,程序是由一个或多个函数组成的。函数是,C,程序中的基本单位。,2.,有两种函数:系统提供的库函数和用户根据需要自
展开阅读全文