C语言课件:第七章.ppt

上传人(卖家):罗嗣辉 文档编号:2088424 上传时间:2022-02-14 格式:PPT 页数:67 大小:709KB
下载 相关 举报
C语言课件:第七章.ppt_第1页
第1页 / 共67页
C语言课件:第七章.ppt_第2页
第2页 / 共67页
C语言课件:第七章.ppt_第3页
第3页 / 共67页
C语言课件:第七章.ppt_第4页
第4页 / 共67页
C语言课件:第七章.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、共 6767 页 第 1 1 页共 6767 页 第 2 2 页 本章要点本章要点 函数的定义函数的定义 函数的调用函数的调用 函数间的数据传递函数间的数据传递 变量的存储类型变量的存储类型 变量的作用范围变量的作用范围 内部函数和外部函数内部函数和外部函数共 6767 页 第 3 3 页 C C程序是函数的集合体,每程序是函数的集合体,每个函数是一个独立的程序模个函数是一个独立的程序模块块。 有一个主函数,若干个子函有一个主函数,若干个子函数,程序总是从主函数开始数,程序总是从主函数开始执行;执行; 函数可集中或分散存放在一函数可集中或分散存放在一个或多个源程序文件中。个或多个源程序文件中。

2、 所有子函数地位平等,可互所有子函数地位平等,可互相调用、自我调用。相调用、自我调用。 引入函数的优点:引入函数的优点: 减少重减少重复编写程序的工作量;使程复编写程序的工作量;使程序便于调试和阅读。序便于调试和阅读。函数函数F1 ( )main ( )F11 ( )F2 ( )F21 ( )F22 ( )共 6767 页 第 4 4 页数学函数数学函数 math.h math.h字符和字符串函数字符和字符串函数 ctype.hctype.h, string.h, string.h输入输入/ /输出输出函数函数 stdio.hstdio.h动态存储分配函数动态存储分配函数 calloc(),m

3、alloccalloc(),malloc()()形式形式无参无参函数函数有参有参函数函数空函数空函数库函数库函数用户定义函数用户定义函数: :共 6767 页 第 5 5 页7-1 输入三个整数,计算它们的和并输出运算结果。输入三个整数,计算它们的和并输出运算结果。main( ) int a, b, c, sum ; scanf(%d,%d,%d,&a,&b,&c); sum=add(a,b,c); printf( sum= %dn,sum); int add(int x, int y, int z) int s; s=x+y+z; return s;函数示例定义的定义的求和函求和函数数共 6

4、767 页 第 6 6 页定义函数应包括的内容:定义函数应包括的内容:(1)指定函数的名字,以便以后按名调用;)指定函数的名字,以便以后按名调用;(2)指定函数的类型,即函数值的类型;)指定函数的类型,即函数值的类型;(3)指定函数的参数的名字和类型(有参);)指定函数的参数的名字和类型(有参);(4)指定函数执行的操作,即函数完成的功能。)指定函数执行的操作,即函数完成的功能。在程序中用到的所有函数,必须先定义,后使用。在程序中用到的所有函数,必须先定义,后使用。共 6767 页 第 7 7 页 定义函数的一般形式定义函数的一般形式类型标识符类型标识符 函数名函数名(形式参数表形式参数表)

5、说明部分说明部分 语句语句若无参数,写若无参数,写void或空。或空。是被初始化的内部变量,是被初始化的内部变量,寿命和可见性仅限于函寿命和可见性仅限于函数内部数内部若不说明类型,一律自若不说明类型,一律自动按整型处理动按整型处理函数体(一段程序,实现函数体(一段程序,实现函数的功能)函数的功能)共 6767 页 第 8 8 页1. 无参函数的定义形式无参函数的定义形式 类型标识符类型标识符 函数名(函数名( ) 说明部分说明部分 语句语句 例例7-1 print_message( ) printf(How are you !n); 共 6767 页 第 9 9 页 例例7-2 int max

6、 (int x,int y) int z; z=xy?x : y; return z; 类型标识符类型标识符 函数名(函数名(形式参数表列形式参数表列) 说明部分说明部分 语句语句 int max ( x, y) int x,y; int z; z=xy?x : y; return z; 形参变量的说明形参变量的说明(传统形式传统形式)形参变量的说明形参变量的说明(现代形式现代形式)2. 有参函数的定义形式有参函数的定义形式共 6767 页 第 1010 页 1. 函数调用的一般形式为:函数调用的一般形式为: 函数名(实际参数列表);函数名(实际参数列表); 或或 函数名(实际参数列表)函数名

7、(实际参数列表)说明:说明: 实参必须有确定的值实参必须有确定的值,可以是常量、变量、表达式及函数调用。可以是常量、变量、表达式及函数调用。 实参与形参的类型、个数、顺序必须一致。实参与形参的类型、个数、顺序必须一致。 多个实参用逗号分隔。多个实参用逗号分隔。 2. 执行过程:执行过程:计算各个表达式计算各个表达式;把得到值赋给对应的形参把得到值赋给对应的形参;执行函数体执行函数体;遇到遇到return语句或执行完最后一条语句,返回到函数调语句或执行完最后一条语句,返回到函数调用处。用处。共 6767 页 第 1111 页(1) 函数语句函数语句: (把(把函数调用作为一个语句)函数调用作为一

8、个语句) 一般形式:一般形式:函数名(实际参数表);函数名(实际参数表); 使用情况:这种方式常用于调用一个可以忽略返回值使用情况:这种方式常用于调用一个可以忽略返回值或没有返回值的函数,只要求函数完成一定的操作。或没有返回值的函数,只要求函数完成一定的操作。 例如:例如: print_message( ); (2) 函数表达式:函数表达式:(函数调用出现在一个表达式中)(函数调用出现在一个表达式中) 一般形式:一般形式:变量名变量名= =函数表达式函数表达式 使用情况:这种表达式称为函数表达式。要求函数使用情况:这种表达式称为函数表达式。要求函数带回带回 一个确定的值参加表达式的运算。一个确

9、定的值参加表达式的运算。 例如:例如:c=3+max(a, b); d=pow(c, i);共 6767 页 第 1212 页 2. 函数的返回值语句函数的返回值语句 一般形式:一般形式: return 表达式表达式; 或或 return (表达式);(表达式); 功能:功能:退出函数,将表达式的值带回主调函数,回退出函数,将表达式的值带回主调函数,回到程序原来的位置继续执行。到程序原来的位置继续执行。 1. 定义定义:通过函数调用使主调函数得到一个确定:通过函数调用使主调函数得到一个确定 的值,称为的值,称为函数的返回值函数的返回值。共 6767 页 第 1313 页说明:说明: retur

10、nreturn语句只能把语句只能把一个返回值一个返回值传递给调用函数。传递给调用函数。 返回值的类型为定义的函数类型,若返回值的类型为定义的函数类型,若returnreturn语句中语句中表达式类型与函数类型不一致,以表达式类型与函数类型不一致,以函数类型为准函数类型为准。 返回值可以是返回值可以是有确定值有确定值的常量、变量或表达式,也的常量、变量或表达式,也可以是地址。当返值是地址时,应该用指针接受。可以是地址。当返值是地址时,应该用指针接受。 无返回值的函数,定义为无返回值的函数,定义为voidvoid类型类型( (无类型函数)。无类型函数)。 一个函数中可以有多个返回语句。一个函数中可

11、以有多个返回语句。共 6767 页 第 1414 页l 例例7-3 7-3 用函数用函数factofacto计算计算 m m 阶乘。阶乘。main( )main( ) int int m; long mm; m; long mm; long facto(int long facto(int ); ); scanf(%dscanf(%d, &m);, &m); mm=facto( m ); mm=facto( m ); printf(%dprintf(%d!=%ld.n, m, mm);!=%ld.n, m, mm); long facto (intlong facto (int x ) x )

12、 long y; long y; for( y=1; x0; -x ) for( y=1; x0; -x ) y y * *= x;= x; return (y); return (y); 函数执行过程函数执行过程 main ( ) mm = facto( m );facto ( x ) return (y );调用调用返回返回函数调用共 6767 页 第 1515 页 main( ) int a,b,c; scanf (“%d,%d”,&a,&b); c=max(a,b); printf(“Max is %d”,c); 例7-4 int max(int x, int y) int z; z=

13、xy? x:y; return(z); 形参:通知系统形参:通知系统 要预留内存位置要预留内存位置.实参:在运行时实参:在运行时把值传给函数把值传给函数.把函数的把函数的 结果赋给函数名结果赋给函数名形参与实参、函数名与返回值之间的关系形参与实参、函数名与返回值之间的关系共 6767 页 第 1616 页/*1*/*2*/*3*/*4*/*5*/*11*/*12*/*13*/*14*/*15*/*16*/main()main() int int a,b,c; a,b,c; scanf(%d,%d,&a,&b scanf(%d,%d,&a,&b);); c= c=max(max(a,ba,b);

14、); printf(”max printf(”max=%dn,c);=%dn,c); int int max(x,y)max(x,y) int int x,y; x,y; int int z; z; if (xy) z=x; if (xy) z=x; else z=y; else z=y; return(z); return(z); 断点断点保护断点和保护断点和现场,转向现场,转向1111入口入口虚实结合虚实结合a-xa-x,b-yb-y返回断点返回断点恢复现场恢复现场带回函数值带回函数值共 6767 页 第 1717 页intint max(x,y) max(x,y) int int x,y

15、; x,y; int int z; z; if (xy) if (xy) z=x; z=x; else z=y; else z=y; return(z); return(z); 返回整型返回整型函数值函数值intint maxmax(x,y)(x,y) int int x,y; x,y; int int z; z; if (xy) if (xy) z=x; z=x; else z=y; else z=y; return;return; 返回不确定返回不确定的函数值的函数值 max(x,y)max(x,y) int int x,y; x,y; int int z; z; if (xy) if (

16、xy) z=x; z=x; else z=y; else z=y; 无返回语句无返回语句在此返回在此返回缺省类型说明缺省类型说明共 6767 页 第 1818 页double power(double x, int n) double p=1; int i; if(n0) for(i=1;iy? x:y; return(z); 建议都加以声明建议都加以声明共 6767 页 第 2525 页被调用函数在主调函数被调用函数在主调函数之前之前定义定义 float add (float x, float y) float z; z=x+y; return (z); main() float a, b;

17、 scanf(“ %f, %f ”,&a, &b); printf(“ sum is %f ”, add(a, b) ); 共 6767 页 第 2626 页在所有函数在所有函数定义之前说明定义之前说明char letter( char,char);float f(float,float );int i(float,float);main( ) .char letter (char c1,char c2)float f(float x,float y)int i(float,float)在所有函数之前在所有函数之前说明函数类型说明函数类型定义函数定义函数letter、f和和i共 6767 页

18、第 2727 页7.2 数组作函数参数数组作函数参数数组元素可以作函数的实参数组元素可以作函数的实参 数组元素作为表达式的组成部分做函数的实参可数组元素作为表达式的组成部分做函数的实参可以单向传递给形参。以单向传递给形参。 例如:例如: int a10; x=power( a6,5);数组名可以作函数的实参和形参数组名可以作函数的实参和形参多维数组可以作函数参数多维数组可以作函数参数共 6767 页 第 2828 页一维数组作函数参数,形参的写法为:一维数组作函数参数,形参的写法为: 类型说明符类型说明符 形参数组名形参数组名数组长度数组长度 例如:例如:float average(float

19、 array10) main() float b10;int i; for(i=0;i10;i+) scanf(“%f”,&bi); average(b); 7.2.1 一维数组作函数参数一维数组作函数参数说明:说明:形参和实参分别定义数组形参和实参分别定义数组数组做函数参数时,实参数组做函数参数时,实参应用应用数组名数组名, 必须有确切值必须有确切值实参数组和形参数组类型实参数组和形参数组类型应一致。应一致。共 6767 页 第 2929 页说明:说明: 实参数组和形参数组大小不一定一致,实参数组和形参数组大小不一定一致,形参数组可以不形参数组可以不指定大小指定大小。(指一维数组)。(指一维

20、数组)。 数组名除作为变量的标识外数组名除作为变量的标识外,还代表该还代表该数组在内存中存数组在内存中存放区域的首地址放区域的首地址。 数组名做函数实参与形参之间是数组名做函数实参与形参之间是“地址传递地址传递”,实参数实参数组将数组的起始地址传递给形参数组。编译系统不再为组将数组的起始地址传递给形参数组。编译系统不再为形参数组分配存储单元。形参数组分配存储单元。 在函数体中对形参数组的元素操作时就是对实参数组的在函数体中对形参数组的元素操作时就是对实参数组的元素进行操作。元素进行操作。形参数组各元素的值发生变化会使实参形参数组各元素的值发生变化会使实参数组各元素的值发生同样的变化数组各元素的

21、值发生同样的变化。 数组名作函数参数可实现大量数据的传递数组名作函数参数可实现大量数据的传递,无须返回数无须返回数组值。组值。共 6767 页 第 3030 页例例7-7 阅读如下程序阅读如下程序,给出打印结果给出打印结果 void swap( int a ) int t; t=a0; a0=a1; a1=t; main( ) int b2=1,2 ; swap(b); printf(“b0=%d,b1=%dn”,b0,b1); 结果:结果:程序运行演示程序运行演示可不定义 长度b数组a数组在调用函数过程在调用函数过程中改变了原数组中改变了原数组的值,实参数组的值,实参数组与形参数组共享与形参

22、数组共享一组存储空间,一组存储空间,共 6767 页 第 3131 页例例7-8 编写函数求编写函数求n元数组的平均值。元数组的平均值。程序设计:程序设计: double average(int a ,int n) int i; double s=0; for(i=0;in;i+) s=s+ai; return s/n; 主函数调用如何编写?主函数调用如何编写? 用另外一个参数表示用另外一个参数表示数组的长度数组的长度共 6767 页 第 3232 页例例7-9:用选择法对数组中:用选择法对数组中10个整数按由小到大排序个整数按由小到大排序.程序设计思想程序设计思想:函数函数sort(arra

23、y, n) :实现数组元素由小到大排序。:实现数组元素由小到大排序。主程序主程序 :输入输入array数组,调用数组,调用 sort 函数比较,输函数比较,输 出排序后的出排序后的array数组。数组。void sort (int array , int n) int i, j, k, t; for (i=0; in-1; i+) k=i; for (j=i+1; jn; j+) if (arrayjarrayk) k=j; if (k!=i) t=arrayk; arrayk=arrayi; arrayi=t; 共 6767 页 第 3333 页main ( ) int a10, i; pr

24、intf(“enter array: n”); for (i=0; i10; i+) scanf (“ %d ”,&ai); sort(a, 10); printf(“the sorted array: n”); for (i=0; i10; i+) printf (“ %d ”, ai); printf(“n”);由于地址传递,由于地址传递,实参数组实参数组 a 改变改变数组名做参数的好处:数组名做参数的好处:由于只需复制一个地址值,而无须复制全部需要处由于只需复制一个地址值,而无须复制全部需要处 理的数据,因此节约存储空间并提高效率。理的数据,因此节约存储空间并提高效率。 由于主调函数和被

25、调函数是在相同的内存区域上对由于主调函数和被调函数是在相同的内存区域上对 数据进行操作,因此可以实现数据的同步更新。数据进行操作,因此可以实现数据的同步更新。 函数调用共 6767 页 第 3434 页二维数组作函数参数,形参的写法为:二维数组作函数参数,形参的写法为: 类型说明符类型说明符 形参名形参名 数组长度数组长度1 数组长度数组长度2说明:说明: 形参数组定义时可以指定或形参数组定义时可以指定或省略第一维的大小省略第一维的大小 例如例如 : int array 310; 或或 int array 10; int array 3 ; 和和int array ;错误错误 实参数组可以实参

26、数组可以大于大于形参数组形参数组 例如:实参数组定义为:例如:实参数组定义为:int array 510; 形参数组定义为:形参数组定义为:int array 310; 这时形参数组只取实参数组的一部分,其余部分不这时形参数组只取实参数组的一部分,其余部分不起作用。起作用。共 6767 页 第 3535 页 例例7-10 7-10 写一函数,求写一函数,求3 3* *4 4矩阵中的最大值。矩阵中的最大值。 int max_value(int array 4) int i, j, max; max=array00; for(i=0 ; i3 ; i+) for(j=0; jmax) max=ar

27、rayij; return (max); main() int a34=1,3,5,7,2,4,6,8,10,12,15,17; printf(“max=%dn”,max_value(a); 函数调用共 6767 页 第 3636 页7.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用7.3.1 函数的嵌套调用函数的嵌套调用 嵌套定义:嵌套定义:在定义一个函数时,该函数体内包含在定义一个函数时,该函数体内包含另一个函数的定义。另一个函数的定义。 嵌套调用:嵌套调用:在调用一个函数的过程中,又调用另在调用一个函数的过程中,又调用另一个函数。一个函数。 C语言不能嵌套定义,但可以嵌套调用!语言

28、不能嵌套定义,但可以嵌套调用!共 6767 页 第 3737 页main函数调用A函数结 束A函数调用B函数B函数192873456 两层嵌套的例子两层嵌套的例子共 6767 页 第 3838 页 7.3.2 7.3.2 函数的递归调用函数的递归调用f 函数调用 f函数1. 1. 递归的概念:递归的概念: 在调用一个函数的过程中在调用一个函数的过程中直接直接或间接地调用该函数本身。或间接地调用该函数本身。直接调用:直接调用:intint f(x) f(x)intint x; x; int int y,z; y,z; z=f(y); z=f(y); return (2 return (2* *z

29、); z); 共 6767 页 第 3939 页int f1(x)int x; int y,z; . z=f2( y); return (2*z); int f2(t)int t; int a,c; . c=f1(a); return (3+c); 间接调用:间接调用:f 1函数函数调用调用 f2函数函数f 2函数函数调用调用 f1函数函数共 6767 页 第 4040 页递归函数的执行过程:递归函数的执行过程: -递归调用:记住本次现场,递归调用。递归调用:记住本次现场,递归调用。 -终了调用:返回上次调用现场。终了调用:返回上次调用现场。特点:特点: -是无终止的递归调用,因此,是无终止的

30、递归调用,因此,应该给定一应该给定一 个个限制递归次数的条件。限制递归次数的条件。 -结构简练。结构简练。共 6767 页 第 4141 页float fac( int n) float f; if(n0) printf(“n1)例例7-11 用递归法求用递归法求n!调用阶乘函数共 6767 页 第 4242 页递归函数递归函数facfac的求解过程,以求的求解过程,以求5 5的阶乘为例:的阶乘为例:f=5*fac( 4)f=4*fac( 3)f=2*fac( 1)f=1f=5*fac(4)f=4*fac( 3)f=2*1f=3*fac( 2)f=3*2*1向向下下递递推推向向上上回回归归共

31、6767 页 第 4343 页例例7-12 用递归法将一个整数用递归法将一个整数n转换成字符串。例如输入转换成字符串。例如输入256,应输出应输出“256”,n的位数不固定,可以是任意位数的整数。的位数不固定,可以是任意位数的整数。void void tranverstranvers(int(int n) n) if(n/10!=0) if(n/10!=0) tranvers(n/10);tranvers(n/10); printf(%c,n%10+0); printf(%c,n%10+0); main( )main( ) int int n; n; printf(“please printf

32、(“please input an input an integral number”);integral number”); scanf(%d,&n scanf(%d,&n);); if(n if(n0)0) printf printf(“-);(“-); n=-1 n=-1* *n;n; tranvers(ntranvers(n);); 共 6767 页 第 4444 页main()函数函数第一次调用第一次调用tranvers函数函数递归函数递归函数tranvers的求解过程示意图的求解过程示意图第二次调用第二次调用tranvers函数函数第三次调用第三次调用tranvers函数函数tra

33、nvers(25)printf(%c,n%10+0);printf(%c,n%10+0);输出字符输出字符2tranvers(2)printf(%c,n%10+0);输出字符输出字符5输出字符输出字符6tranvers(256)结束结束共 6767 页 第 4545 页 char 型型 int 型型 float 型型 double 型型(VC+环境)共 6767 页 第 4646 页 变量的作用域和生存期变量的作用域和生存期: :u 变量的作用域变量的作用域 指一个变量在程序中的有效范围。(也称为可见性)指一个变量在程序中的有效范围。(也称为可见性) C C语言规定语言规定:凡是在函数内定义的

34、变量,它的作用域仅仅是凡是在函数内定义的变量,它的作用域仅仅是本函数内;本函数内;而在函数体外定义的变量,它的作用域是而在函数体外定义的变量,它的作用域是从定义从定义点到文件尾点到文件尾。u 变量的生存期变量的生存期 指程序在执行期间,变量存在的时间间隔,即从给变量分指程序在执行期间,变量存在的时间间隔,即从给变量分配内存,至所分配内存被系统收回的那段时间。配内存,至所分配内存被系统收回的那段时间。 共 6767 页 第 4747 页1.1.局部变量(内部变量)局部变量(内部变量) 定义:在函数内部定义的变量,只能在本函数内部使用。定义:在函数内部定义的变量,只能在本函数内部使用。 说明:说明

35、: 主函数主函数 main main 定义的变量只在主函数中有效,定义的变量只在主函数中有效,主函数不能主函数不能使用其它函数定义的变量使用其它函数定义的变量。 不同函数不同函数可以使用可以使用相同名字相同名字的变量。的变量。 形式参数也是局部变量。形式参数也是局部变量。 可以在一个函数内部,也可以在复合语句中定义变量;复可以在一个函数内部,也可以在复合语句中定义变量;复合语句中定义的变量只在合语句中定义的变量只在本复合语句中有效本复合语句中有效。7.4.1 局部变量和全局变量局部变量和全局变量char search(char s) char ch; int k; 变量变量s、ch、k的作用域

36、的作用域编译系统不为局部变量分配内存编译系统不为局部变量分配内存单元,只是当被调用时,根据需单元,只是当被调用时,根据需要分配临时单元,调用结束,空要分配临时单元,调用结束,空间释放。间释放。共 6767 页 第 4848 页例:例:main()int m,n; int x,y; 变量变量x,y的的作用域作用域变量变量m,n的的作用域作用域共 6767 页 第 4949 页2. 2. 全局变量全局变量定义:定义:在函数之外定义的变量是全局变量在函数之外定义的变量是全局变量( (外部变量外部变量) )。语法:语法:类型说明类型说明 变量名变量名 ;使用范围:使用范围:可以为本文件中所有的函数公用

37、。可以为本文件中所有的函数公用。 从定义变量的位置开始到本文件结束,这段程序中的函数从定义变量的位置开始到本文件结束,这段程序中的函数可直接使用全局变量,可直接使用全局变量,int a,b=3;main( ) float k;char str(char s20) 全局变量全局变量a、b的作用域的作用域全局变量全局变量k的作用域的作用域共 6767 页 第 5050 页 int p=1,q=5; /*外部变量外部变量*/ f1( int a) /*定义函数定义函数*/ int b,c; char c1,c2; /*外部变量外部变量*/ f2( int a, int b) /*定义函数定义函数*/

38、 . main() int m,n 全局变量c1、c2的作用范围全局变量p、q的作用范围共 6767 页 第 5151 页例如:例如:#include “stdio.h”int a=7,b=10;main( ) int a=5,c; c=a+b; printf(“c=%dn”,c); 在同一源文件中,全局变量和局部变量在同一源文件中,全局变量和局部变量可以同名可以同名,在局部变量的作用范围内,在局部变量的作用范围内,全局变量不起作用。全局变量不起作用。C=15全局变量局布变量局部变量全局变量共 6767 页 第 5252 页优点:优点: 函数间数据联系:同一文件中的一些函数引用全局函数间数据联

39、系:同一文件中的一些函数引用全局 变量,当某个函数中改变了全局变量的值,其它函数变量,当某个函数中改变了全局变量的值,其它函数中的全局变量值也随之改变。中的全局变量值也随之改变。 函数可以得到多个返回值。函数可以得到多个返回值。缺点:缺点: 全局变量在程序的全部执行过程中都占用存储单元。全局变量在程序的全部执行过程中都占用存储单元。 降低函数的通用性。降低函数的通用性。 使用过多,降低程序的清晰性。使用过多,降低程序的清晰性。 全局变量应尽可能少用。全局变量应尽可能少用。 共 6767 页 第 5353 页 变量的存储类别变量的存储类别 静态存储方式:静态存储方式:程序运行期间分配固定存储空间

40、的方式。程序运行期间分配固定存储空间的方式。 动态存储方式:动态存储方式:程序运行期间根据需要进行动态的分配存储程序运行期间根据需要进行动态的分配存储空间的方式。空间的方式。程序区程序区静态存储区静态存储区动态存储区动态存储区全局变量,局部静态变量全局变量,局部静态变量形式参数形式参数局部变量(自动)局部变量(自动)函数调用的现场函数调用的现场保护和返回地址保护和返回地址7.4.2 7.4.2 变量的存储方法变量的存储方法共 6767 页 第 5454 页 动态存储变量特点动态存储变量特点 函数开始调用时为变量分配存储空间,函数结束时释放函数开始调用时为变量分配存储空间,函数结束时释放这些空间

41、。这些空间。 静态存储变量特点静态存储变量特点 在在 静态存储区分配存储单元,整个程序运行期间都不释放。静态存储区分配存储单元,整个程序运行期间都不释放。变量存贮类型有四种:变量存贮类型有四种:自动变量(自动变量(autoauto)静态变量(静态变量(staticstatic)外部变量(外部变量(externextern)寄存器变量(寄存器变量(registerregister)autoauto、staticstatic、externextern和和registerregister为存贮类型说明符。为存贮类型说明符。共 6767 页 第 5555 页(1)自动变量)自动变量 (auto) 函数

42、中的局部变量,不做任何存储类别的说明都为自动变量。函数中的局部变量,不做任何存储类别的说明都为自动变量。 定义形式:定义形式:auto 类型说明符类型说明符 变量名变量名 ; 说明:说明:“auto”可以省略。可以省略。 以前所使用的全部变量都是自动变量。以前所使用的全部变量都是自动变量。 自动变量必须在一个自动变量必须在一个函数体的内部。函数体的内部。 函数的形参也是自动变量。函数的形参也是自动变量。 例如:例如:int b, c=3 等价于等价于 auto int b, c=3; 作用域作用域:包含变量定义的复合语句或所说明的函数内部:包含变量定义的复合语句或所说明的函数内部 ; 在函数被

43、调用时才存在,从函数中返回时即消失,在函数被调用时才存在,从函数中返回时即消失, 值也仅限于说明它的函数,在其它的函数中不能存取值也仅限于说明它的函数,在其它的函数中不能存取, 在两个不同的函数中可以分别使用同名的变量。在两个不同的函数中可以分别使用同名的变量。1.局部变量的存储方法局部变量的存储方法共 6767 页 第 5656 页(2)局部静态变量)局部静态变量 定义形式:定义形式:在变量名前面加在变量名前面加 关键字关键字static static 类型说明符类型说明符 变量名;变量名;局部静态变量编译时赋初值,每次调用时不赋初值,局部静态变量编译时赋初值,每次调用时不赋初值,只保留调用

44、结束时变量的值。如果不赋初值,编译只保留调用结束时变量的值。如果不赋初值,编译时自动赋时自动赋0值。值。局部静态变量只允许所在函数引用,局部静态变量只允许所在函数引用,其它函数不能引用。其值整个程序运行期间都不释其它函数不能引用。其值整个程序运行期间都不释放。放。自动变量不赋初值,其值自动变量不赋初值,其值不确定不确定。每调用一次,重。每调用一次,重新赋值一次。新赋值一次。共 6767 页 第 5757 页例如:例如:f(int a) int b=0; static int c=3; b=b+1; c=c+1; return( a+b+c);main( ) int a=2 , i; for(i

45、=0; i3; i+) printf(“%d,”,f(a);运行结果为:运行结果为: 7 ,8 ,9第一次调第一次调用开始用开始第一次调第一次调用结束用结束第二次调第二次调用开始用开始0b34410c局部静态变量共 6767 页 第 5858 页(3)寄存器变量)寄存器变量 (register) 直接放置在运算器的寄存器中的变量称为寄存器变量直接放置在运算器的寄存器中的变量称为寄存器变量. 定义形式:定义形式: register 类型说明符类型说明符 变量名;变量名; 作用:作用:对于使用频繁的变量,定义为寄存器变量,不必从内存对于使用频繁的变量,定义为寄存器变量,不必从内存而是直接从寄存器中

46、取出参加运算,提高程序执行效率。而是直接从寄存器中取出参加运算,提高程序执行效率。 说明:说明:只有只有局部自动变量局部自动变量和和形式参数形式参数可作为寄存器变量,其它如局可作为寄存器变量,其它如局部静态变量和全局变量不可以。部静态变量和全局变量不可以。属于属于动态动态存储方式,函数开始调用时为变量分配寄存器空间,存储方式,函数开始调用时为变量分配寄存器空间,函数结束时释放寄存器空间。函数结束时释放寄存器空间。只有只有int、char和指针类型可定义为寄存器变量,而和指针类型可定义为寄存器变量,而long、double和和float型变量不能设定为寄存器型型变量不能设定为寄存器型 。可用于变

47、量空间分配的寄存器个数依赖于具体的机器。通常可用于变量空间分配的寄存器个数依赖于具体的机器。通常为为2到到3个,若在一个函数中说明多于个,若在一个函数中说明多于2到到3个寄存器变量,编个寄存器变量,编译程序会自动地将它们变为自动变量。译程序会自动地将它们变为自动变量。 共 6767 页 第 5959 页2. 全局变量的存储类型(两种:外部全局变量、静态全局变量)全局变量的存储类型(两种:外部全局变量、静态全局变量)(1)外部全局变量)外部全局变量 在多个源程序文件的情况下,如果在一个文件中要引用在其它文件在多个源程序文件的情况下,如果在一个文件中要引用在其它文件中定义的全局变量,则应该在需要中

48、定义的全局变量,则应该在需要引用此变量的文件中引用此变量的文件中,用,用extern做说做说明。例如:明。例如: prog1.c的内容如下:的内容如下:int a;main( ) x=6; f1( );void f1( ) a+=2; printf(a=%dn, a); f2( );prog2.c的内容为:的内容为:extern int a;void f2( ) a+; printf(a=%dn, a); 共 6767 页 第 6060 页(2)静态全局变量)静态全局变量 在在一个文件中定义的全局变量仅限于本文件引用,一个文件中定义的全局变量仅限于本文件引用,而不能被其它文件访问而不能被其它文

49、件访问,则可以定义则可以定义为静态为静态全局变量全局变量。 例如:例如: static int x; 说明:说明: 外部全局变量与静态全局变量在同一文件内的作用域外部全局变量与静态全局变量在同一文件内的作用域一样;一样;外部全局变量可以被多个文件引用,而静态全局变量外部全局变量可以被多个文件引用,而静态全局变量仅在定义它的文件内有效,在程序的其它文件中不可使仅在定义它的文件内有效,在程序的其它文件中不可使用。用。 例如:例如:file1.c file2.c static int a ; extern int a; static int a只能用于只能用于file1.c ,虽然虽然file2.c

50、中将中将 同名同名变量变量 int a说明为说明为extern,但仍无法使用,但仍无法使用file1.c 中的中的 a变变量。量。共 6767 页 第 6161 页7.7.5 5 内部函数和外部函数内部函数和外部函数1 . 内部函数内部函数(静态函数)静态函数)定义定义:如果一个函数只能被本文件中其它函数调用,如果一个函数只能被本文件中其它函数调用,称为内部函数。称为内部函数。定义格式定义格式: static 类型标识符类型标识符 函数名(形参表)函数体函数名(形参表)函数体 例如:例如:static int fun(a, b) 作用作用:函数的作用域限于所在文件,不同文件中同函数的作用域限于

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

当前位置:首页 > 大学
版权提示 | 免责声明

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


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

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


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