第12章+用户标识符的作用域和存储类课件.ppt

上传人(卖家):晟晟文业 文档编号:4710028 上传时间:2023-01-03 格式:PPT 页数:38 大小:385.10KB
下载 相关 举报
第12章+用户标识符的作用域和存储类课件.ppt_第1页
第1页 / 共38页
第12章+用户标识符的作用域和存储类课件.ppt_第2页
第2页 / 共38页
第12章+用户标识符的作用域和存储类课件.ppt_第3页
第3页 / 共38页
第12章+用户标识符的作用域和存储类课件.ppt_第4页
第4页 / 共38页
第12章+用户标识符的作用域和存储类课件.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、12.1 12.1 变量的作用域和生存期变量的作用域和生存期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()/*主函数

2、主函数*/int m,n;m、n有效有效(1)(1)主函数中定义的变量只在主函数中有效。主函数中定义的变量只在主函数中有效。(2)(2)不同函数中可以使用相同名字的变量不同函数中可以使用相同名字的变量,它它们代表不同的对象们代表不同的对象,互不干扰。互不干扰。(3)(3)形式参数也是局部变量。形式参数也是局部变量。(4)(4)在一个函数内部在一个函数内部,可以在可以在复合语句中定义复合语句中定义变量变量,这些变量只在本复合语句中有效这些变量只在本复合语句中有效,这这种复合语句也称为种复合语句也称为“分程序分程序”或或“程序程序块块”。main()int a=3,b=2,c=1;c-=+b;b*

3、=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,12,3,-22、全局变量全局变量 在函数内定义的变量是局部变量在函数内定义的变量是局部变量,而而在函数之外定义的变量称为在函数之外定义的变量称为外部变量外部变量,外外部变量是部变量是全局变量全局变量(也称全程变量也称全程变量)。全局。全局变量可以为本文件中其他函数所共用。它变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本的有效范围为从定义变量的位置开始到本源文件结束。源文件结束。int p=1,

4、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;有有4 4个学生,个学生,5 5门课的成绩,要求输出其中的最高门课的成绩,要求输出其中的最高成绩以及它属于第几个学生、第几门课程。成绩以及它属于第几个学生、第几门课程。例题例题解题思路解题思路 除了输出最高分以外,还要输出该分数是属于除了输出最高分以外,还要输出该分数是属于第几个学生、笫几门课的信息,即需

5、要输出第几个学生、笫几门课的信息,即需要输出3 3个结果个结果。但是调用一个函数只能得到一个函数值,可以使。但是调用一个函数只能得到一个函数值,可以使用全局变量,通过全局变量从函数中得到所需要的用全局变量,通过全局变量从函数中得到所需要的值值 编写程序编写程序#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,7

6、6,71;printf(The highest score is%6.2fn,highest_score(score);printf(Student No.is%dnCourse No.is%dn,Row,Column);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 Row*/Column=j;/*将列的序号赋给全局变量将列的序号赋给全局变量Column Column*

7、/return(max);由于全局变量在整个文件范围内都由于全局变量在整个文件范围内都有效,因此在有效,因此在highest_scorehighest_score函数中将行函数中将行序号序号i i和列序号和列序号j j赋给全局变量赋给全局变量RowRow和和ColumnColumn,在函数调用结束后,函数中的局,在函数调用结束后,函数中的局部变量被释放了,但全局变量保存下来,部变量被释放了,但全局变量保存下来,可以在可以在mainmain函数中输出它们的值。函数中输出它们的值。建议不在必要时不要使用全局变量:全局变量在程序的全部执行过程中都占用存全局变量在程序的全部执行过程中都占用存储单元,而

8、不是仅在需要时才开辟单元。储单元,而不是仅在需要时才开辟单元。使用全局变量过多,会降低程序的清晰性。使用全局变量过多,会降低程序的清晰性。在各个函数执行时都可能改变外部变量的值,程在各个函数执行时都可能改变外部变量的值,程序容易出错。序容易出错。12.3 12.3 变量的存储方式和生存期变量的存储方式和生存期 从变量的作用域(即从空间)角从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变度来分,可以分为全局变量和局部变量。从变量值存在的时间角度来分,量。从变量值存在的时间角度来分,又可以分为静态存储方式和动态存储又可以分为静态存储方式和动态存储方式。方式。所谓静态存储方式是指在程序运

9、行期所谓静态存储方式是指在程序运行期间由系统间由系统分配固定的存储空间分配固定的存储空间的方式。动的方式。动态存储方式则是在程序运行期间根据需要态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。这个存进行动态的分配存储空间的方式。这个存储空间可以分为三部分:储空间可以分为三部分:1.1.程序区程序区 2.2.静态存储区静态存储区 3.3.动态存储区动态存储区 在语言中每一个变量和函数有两个属性:在语言中每一个变量和函数有两个属性:数据类型和数据的存储类别数据类型和数据的存储类别存储方式分为两大类:存储方式分为两大类:静态存储类和动态存储类静态存储类和动态存储类。具体包含四种:具

10、体包含四种:自动的(自动的(autoauto),静态的(),静态的(staticstatic)寄存器的(寄存器的(registerregister),外部的),外部的(extern(extern)。)。1 1、autoauto变量变量 函数中的局部变量,如不专门声明为函数中的局部变量,如不专门声明为staticstatic存储存储类别,都是类别,都是动态动态地分配存储空间的,数据存储在动地分配存储空间的,数据存储在动态存储区中。态存储区中。自动变量用关键字自动变量用关键字autoauto作存储类别的声明。作存储类别的声明。例如:例如:intint (intint )*定义定义f f函数,函数,

11、a a为形参为形参 *auto intauto int ,;,;/*定义、为自动变量定义、为自动变量 *2 2、static-static-声明静态变量声明静态变量(1)静态局部变量:当函数中的局部变量的)静态局部变量:当函数中的局部变量的值在函数调用结束后不消失而保留原值时,值在函数调用结束后不消失而保留原值时,该变量称为静态局部变量。用关键字该变量称为静态局部变量。用关键字static进进行声明。行声明。输出到的阶乘值。输出到的阶乘值。例题例题解题思路解题思路 可以编一个函数用来进行一次累乘,如可以编一个函数用来进行一次累乘,如第第1 1次调用时进行次调用时进行1 1乘乘1 1,第,第2

12、2次调用时再乘次调用时再乘以以2 2,第,第3 3次调用时再乘以次调用时再乘以3 3,依此规律进行,依此规律进行下去。这时希望上一次求出的连乘值保留,下去。这时希望上一次求出的连乘值保留,以便下一次再乘上一个数。可以用以便下一次再乘上一个数。可以用staticstatic来指定变量不释放,保留原值。来指定变量不释放,保留原值。#include void main()int fac(int n);int i;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);int fac(int n)static int f=1;f=f*n;return f;编写程序编写程序对静态局

13、部变量的说明:对静态局部变量的说明:1.1.静态局部变量属于静态存储类别,在静态存储静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。间,函数调用结束后即释放。2.2.对静态局部变量是在编译时赋初值的,即对静态局部变量是在编译时赋初值的,即只赋只赋初值一次初值一次,在程序运行时它已有初值。以后每次,在程序运行时它已有初值。以后每次

14、调用函数时不再重新赋初值而只是保留上次函数调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。调用结束时的值。3.3.对静态局部变量来说,编译时自动赋初对静态局部变量来说,编译时自动赋初值(对数值型变量)或空字符(对字符变值(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。它的值是一个不确定的值。4.4.虽然静态局部变量在函数调用结束后仍虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。然存在,但其他函数不能引用它。(2 2)静态外部变量:在程序设计中)静态外部变量:在程序设计中,某些外部某

15、些外部变量只限于被本文件引用,而不能被其他文件引变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个用。这时可以在定义外部变量时加一个staticstatic声声明。明。例如:例如:file1.c file1.c static intstatic int A;A;void main()void main()3.register-3.register-声明寄存器变量声明寄存器变量(register(register变量变量)变量的值是存放在内存中的。当程序中用到变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该哪一个变量的值时,由控制器发出

16、指令将内存中该变量的值送到运算器中。变量的值送到运算器中。经过运算器进行运算,经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。如果需要存数,再从运算器将数据送到内存存放。4.extern-4.extern-声明外部变量的作用范围声明外部变量的作用范围 外部变量是在函数的外部定义的全局变量,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静中各个函数所引用。编译时将外部变量分配在静态存

17、储区。用态存储区。用externextern来声明外部变量,以扩展外来声明外部变量,以扩展外部变量的作用城。部变量的作用城。(1)在一个文件内声明外部变量在一个文件内声明外部变量例:用例:用extern声明外部变量,扩展它在程序文声明外部变量,扩展它在程序文件中的作用域件中的作用域#include void main()int max(int,int);*外部变量声明外部变量声明*extern A,B;printf(%dn,max(A,B);int A=13,B=-8;*定义外部变量定义外部变量*int max(int x,int y)*定义函数定义函数*int z;z=xy?x:y;retu

18、rn(z);(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,);,);文件文件file.c中的内容为:中的内容为:extern A;/*声明声明A为一个已定义的外部变为一个已定义的外部变量量*/int(int)

19、;int,;,;for(;)(;)*A;();();(1)(1)从作用域角度分,有局部变量和全局变量。从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:它们采用的存储类别如下:局部变量包括:局部变量包括:自动变量、自动变量、静态局部变量、寄存器变量。静态局部变量、寄存器变量。形式参数可以定义为自动变量或寄存器变量形式参数可以定义为自动变量或寄存器变量 全局变量包括:全局变量包括:静态外部变量、外部变量静态外部变量、外部变量(2 2)从变量存在的时间来区分,有动态存储和)从变量存在的时间来区分,有动态存储和静态存储两种类型。静态存储两种类型。静态存储是程序整个运行时间都存在,静态存储

20、是程序整个运行时间都存在,动态存储则是在调用函数时临时分配单元。动态存储则是在调用函数时临时分配单元。动态存储动态存储 :自动变量、寄存器变量、形式参数:自动变量、寄存器变量、形式参数静态存储:静态局部变量、静态外部变量静态存储:静态局部变量、静态外部变量 、外部变量外部变量(4)static(4)static对局部变量和全局变量的作用对局部变量和全局变量的作用不同。对局部变量来说不同。对局部变量来说,它使变量由动它使变量由动态存储方式改变为静态存储方式。而对态存储方式改变为静态存储方式。而对全局变量来说全局变量来说,它使变量局部化,但仍它使变量局部化,但仍为静态存储方式。从作用域角度看为静态

21、存储方式。从作用域角度看,凡凡有有staticstatic声明的,其作用域都是局限的,声明的,其作用域都是局限的,或者是局限于本函数内,或者局限于本或者是局限于本函数内,或者局限于本文件内。文件内。内部函数和外部函数内部函数和外部函数 根据函数能否被其他源文件调用,将函数区分为内部内部函数函数和外部函数外部函数。如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。即static 类型标识符 函数名(形参表)例如例如:static int fun(int a,int b)(1)(1)定义函数时定义函数时,如果在函数首部的最左端加如果

22、在函数首部的最左端加关键字关键字extern,extern,则表示此函数是外部函数,可则表示此函数是外部函数,可供其他文件调用。如果在定义函数时省略供其他文件调用。如果在定义函数时省略extern,extern,则隐含为外部函数。则隐含为外部函数。(2)(2)在需要调用此函数的文件中在需要调用此函数的文件中,用用externextern对函对函数作声明,表示该函数是在其他文件中定义的外数作声明,表示该函数是在其他文件中定义的外部函数部函数 有一个字符串有一个字符串,内有若干个字符内有若干个字符,今输入一个字符今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。要求程序将字符串中该字符

23、删去。用外部函数实现。例题例题解题思路解题思路 对对strstr数组的字符逐个检查,如果不是被删除的字数组的字符逐个检查,如果不是被删除的字符(设删除空格)就将它存放在数组中符(设删除空格)就将它存放在数组中.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行声明在本函数中将要调用的在其他文件中行声明在本函数中将要调用的在其他文件中定

24、义的定义的3 3个函数个函数*char c;char str80;scanf(%c,&c);detele_string(str,c);print_string(str);编写程序编写程序file.c(文件)(文件)#include void enter_string(char str80)gets(str);*向字符数组输入字符串向字符数组输入字符串*File3.c(文件)(文件)void delete_string(char str,char ch)*定义外部函数定义外部函数delete_stringdelete_string *int i,j;for(i=j=0;stri!=0;i+)if

25、(stri!=ch)strj+=stri;stri=0;file.c(文件)(文件)#include void print_string(char str)printf(%sn,str);运行情况如下:运行情况如下:(输入)输入)(输入要删去的字符)(输入要删去的字符)(输出已删去指定字符的字符串)(输出已删去指定字符的字符串)本章小结1.1.在在C C语言中,函数是用来完成某一个特定功能的。语言中,函数是用来完成某一个特定功能的。C C程序是程序是由一个或多个函数组成的。函数是由一个或多个函数组成的。函数是C C程序中的基本单位。程序中的基本单位。2.2.有两种函数:系统提供的库函数和用户根

26、据需要自己定义有两种函数:系统提供的库函数和用户根据需要自己定义的函数。的函数。3.3.函数的函数的“定义定义”和和“声明声明”不是一回事。不是一回事。4.4.函数原型有两种形式:函数原型有两种形式:(1)(1)函数类型函数类型 函数名函数名(参数类型参数类型1 1 参数名参数名1 1,参数类型,参数类型2 2 参数参数名名2 2,参数类型,参数类型n n 参数名参数名n)n);(2)(2)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数类型,参数类型2 2,参数类,参数类型型n)n);5.5.调用函数时要注意实参与形参个数相同、类型一致调用函数时要注意实参与形参个数相同、类型一致

27、(或赋或赋值兼容值兼容)。6.6.在调用一个函数的过程中,又调用另外一个函数,称在调用一个函数的过程中,又调用另外一个函数,称为函数的嵌套调用。在调用一个函数的过程中又出现直为函数的嵌套调用。在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。接或间接地调用该函数本身,称为函数的递归调用。7.7.用数组名作函数实参,向形参传递的是数组首元素的用数组名作函数实参,向形参传递的是数组首元素的地址地址8.8.变量的作用域是指变量有效的范围。根据定义变量的位变量的作用域是指变量有效的范围。根据定义变量的位置不同,变量分为局部变量和全局变量。凡是在函数内置不同,变量分为局部变量和全局变量。凡是在函数内或复合语句中定义的变量都是局部变量,在函数外定义或复合语句中定义的变量都是局部变量,在函数外定义的变量都是全局变量,的变量都是全局变量,9.9.变量的生存期指的是变量存在的时间。变量的生存期指的是变量存在的时间。10.10.变量的存储类别共有变量的存储类别共有4 4种:种:auto,static,register,externauto,static,register,extern。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第12章+用户标识符的作用域和存储类课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|