模块化程序设计_第1页
模块化程序设计_第2页
模块化程序设计_第3页
模块化程序设计_第4页
模块化程序设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022-5-23C语言程序设计语言程序设计12022-5-23C语言程序设计语言程序设计2是是C程序的基本单位,每一个函数模块用来实程序的基本单位,每一个函数模块用来实现一个特定的功能。现一个特定的功能。1 1理解函数的功能。理解函数的功能。2 2掌握函数定义的一般形式。掌握函数定义的一般形式。3 3掌握函数的形参与实参的对应关系、参数传递方法及函数掌握函数的形参与实参的对应关系、参数传递方法及函数返回值的概念。返回值的概念。4 4掌握函数调用的几种形式。掌握函数调用的几种形式。5 5掌握函数嵌套调用的一般过程。掌握函数嵌套调用的一般过程。6. 6. 掌握指针的定义、使用以及指针作为函数的参

2、数。掌握指针的定义、使用以及指针作为函数的参数。7. 7. 掌握返回指针值的函数。掌握返回指针值的函数。8 8掌握局部变量与全局变量的概念及它们的使用特点。掌握局部变量与全局变量的概念及它们的使用特点。函数:函数:main(),getchar(),putchar(),printf(),scanf(),exp(),fabs(),sqrt(),gets(),puts(),strcpy(),strcmp(),strcat(),strupr(),strlwr(),strlen()等。等。 例:从键盘中输入两个数,分别求出这两个数的最小例:从键盘中输入两个数,分别求出这两个数的最小公倍数和最大公约数。公

3、倍数和最大公约数。2022-5-23C语言程序设计语言程序设计4int gys(int x,int y) int gbs(int x,int y)#include void main() int a,b,m,n; printf(“input 2 numbers:n”); scanf(“%d,%d”&a,&b); m=gys(a,b);n=gbs(a,b); printf(“gys=%d,gbs=%dn”,m,n);2022-5-23C语言程序设计语言程序设计5结构化程序设计方法:结构化程序设计方法:自上向下、逐步分解、分自上向下、逐步分解、分而治之而治之源程序文件源程序文件1 1预编译命令预编

4、译命令说明部分说明部分执行部分执行部分函数函数1 1函数函数n n源程序文件源程序文件i i源程序文件源程序文件n nC C程序程序C C程序结构程序结构&必须有且只能有一个名为必须有且只能有一个名为mainmain的主函数的主函数&C C程序的执行总是程序的执行总是从从mainmain函数开始,在函数开始,在mainmain中结束中结束&函数函数不能嵌套定义不能嵌套定义, ,可以可以嵌套嵌套调用调用2022-5-23C语言程序设计语言程序设计6模块化程序设计的特点:模块化程序设计的特点:(1 1)模块相对独立,功能单一。编写相对简单,可)模块相对独立,功能单一。编写相对简单,可以独立编写调试

5、。以独立编写调试。(2 2)可集体开发,缩短开发周期。不同的模块可以)可集体开发,缩短开发周期。不同的模块可以由不同的人员开发,最终能够合成完整的程序。由不同的人员开发,最终能够合成完整的程序。(3 3)开发出的模块,可在不同的应用程序中多次使)开发出的模块,可在不同的应用程序中多次使用,减少重复劳动,提高开发效率。用,减少重复劳动,提高开发效率。 (4)测试、更新以模块为单位进行而不会影响其他)测试、更新以模块为单位进行而不会影响其他模块。模块。 n函数分类函数分类n从用户角度从用户角度n标准函数(库函数):由系统提供标准函数(库函数):由系统提供n用户自定义函数用户自定义函数n从函数形式从

6、函数形式n无参函数无参函数n有参函数有参函数使用使用库函数库函数(见教材附录(见教材附录D)应注意:应注意:1、函数功能、函数功能2、函数参数的数目和顺序,及各参数意义和类型、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型、函数返回值意义和类型4、需要使用的包含文件、需要使用的包含文件2022-5-23C语言程序设计语言程序设计8函数体函数体编写方法与主编写方法与主函数的编写方函数的编写方法一样法一样2022-5-23C语言程序设计语言程序设计9例例3.1:计算整数:计算整数x的的y次方次方long power(int x,int y) int n;long p=1; for

7、(n=1;n=y;n+) p=p*x; return(p);函数类型函数类型参数列表参数列表返回值返回值void main() int a,b;long c; scanf(“%d%d”,&a,&b); c=power(a,b); printf(“c=%ldn”,c);2022-5-23C语言程序设计语言程序设计10例例3.2 void print1( ) printf(“Welcome to China!n”);main( ) print1(); print1(); print1();函数可以函数可以无参数无参数2022-5-23C语言程序设计语言程序设计11n函数语句函数语句: 例例 pri

8、ntstar(); printf(“Hello,World!n”);n函数表达式函数表达式: 例例 m=max(a,b)*2;n函数参数函数参数: 例例 printf(“%d”,max(a,b); m=max(a,max(b,c);2022-5-23C语言程序设计语言程序设计12例例3.3:用函数实现两个数的数值交换:用函数实现两个数的数值交换#include void swap(int a,int b) int t; t=a;a=b;b=t; printf(“result :x=%d y=%dn”,a,b);void main() int x=10,y=5; printf(“x=%d,y=%

9、dn”,x,y); swap(x,y);形式参数形式参数实际参数实际参数2022-5-23C语言程序设计语言程序设计13形参与实参形参与实参形式参数形式参数:定义函数时函数名后面括号中的变量名定义函数时函数名后面括号中的变量名实际参数实际参数:调用函数时函数名后面括号中的表达式调用函数时函数名后面括号中的表达式v说明说明 实参必须有确定的值,可以是常量、变量、表实参必须有确定的值,可以是常量、变量、表达式、函数等;达式、函数等;形参必须指定类型;形参必须指定类型;形参与实参形参与实参类型一致,个数相同;类型一致,个数相同;形参在函数被调用前不占内存形参在函数被调用前不占内存; ;函数调用时为形

10、函数调用时为形参分配内存;调用结束,内存释放。参分配内存;调用结束,内存释放。2022-5-23C语言程序设计语言程序设计14n参数传递方式参数传递方式n值传递方式值传递方式n方式:函数调用时方式:函数调用时,为形参分配单元为形参分配单元,并将实参的并将实参的值值复制复制到形参中;调用结束,形参单元被释放,到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值实参单元仍保留并维持原值n特点:特点:n形参与实参占用不同的内存单元形参与实参占用不同的内存单元n单向传递,实参的值传给形参单向传递,实参的值传给形参2022-5-23C语言程序设计语言程序设计15c=max(a,b);(main

11、函数)函数) (max 函数)函数)max(int x, int y) int z; z=xy?x:y; return(z); 例例3.4 比较两个数并输出大者比较两个数并输出大者#include void main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);int max(int x, int y) int z; z=xy?x:y; return(z);实参实参形参形参2022-5-23C语言程序设计语言程序设计16n函数语句函数语句: 例例 printstar(); printf(“Hello,Worl

12、d!n”);n函数表达式函数表达式: 例例 m=max(a,b)*2;n函数参数函数参数: 例例 printf(“%d”,max(a,b); m=max(a,max(b,c);函数调用时函数调用时,为形参分配单元为形参分配单元,并将实参并将实参的值的值复制复制到形参中;调用结束,形参单到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值元被释放,实参单元仍保留并维持原值例例 3.5 计算计算x的立方的立方#include float cube(float x) return(x*x*x);void main() float a, product; printf(Please input

13、 value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct1.21.21.7282022-5-23C语言程序设计语言程序设计18 例例3. 6 从键盘中输入一个年份,判断该年是否是从键盘中输入一个年份,判断该年是否是闰年。闰年。#include void main() int year,st; printf(“Input a year: n”); scanf(“%d”,&year); st=leap(year); if(st=1) printf(“n%d is

14、runniann”,year); else printf(“n%d is not runniann”,year );int leap(int year) int st; if(year%4=0& year%100!=0|year%400=0) st=1; else st=0; return(st);实际参数实际参数形式参数形式参数2022-5-23C语言程序设计语言程序设计19函数体函数体编写方法与主编写方法与主函数的编写方函数的编写方法一样法一样6、函数声明的一般格式、函数声明的一般格式函数类型函数类型 函数名函数名(形参类型形参类型 形参名形参名,. )2022-5-23C语言程序设计语言

15、程序设计20n形式形式: return(表达式表达式); 或或 return 表达式表达式; 或或 return;n功能功能:使程序控制从被调用函数返回到调用函数:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数中,同时把返值带给调用函数n说明说明:n函数中可有多个函数中可有多个return语句语句,一旦遇到一个一旦遇到一个return语句,就立即返回到主调函数。语句,就立即返回到主调函数。n若无若无return语句,遇语句,遇时,自动返回调用函数时,自动返回调用函数n若函数类型与若函数类型与return语句中表达式值的类型语句中表达式值的类型不一致,按前者为准,自动转换不一致,

16、按前者为准,自动转换-函数调函数调用转换用转换nvoid型函数型函数int max(int x,int y)if(xy) return(x); return(y);void main()int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max is %d”,c);2022-5-23C语言程序设计语言程序设计21例例3.7 函数返回值类型转换函数返回值类型转换#include int max(float x, float y) float z; z=xy?x:y; return(z);void main() float a,b; int c

17、; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);输入:输入:23.0,66.0输出:输出:662022-5-23C语言程序设计语言程序设计22例例3.8:从键盘中输入两个数,分别求出这两个:从键盘中输入两个数,分别求出这两个数的最小公倍数和最大公约数。数的最小公倍数和最大公约数。int gys(int x,int y)int gbs(int x,int y) return(x*y/gys(x,y);int s; s= x*y/gys(x,y); return(s);int t,s; if(xy) t=x;x=y;y=t; while

18、(s=y%x)!=0) y=x;x=s; return(x); 2022-5-23C语言程序设计语言程序设计23一、一般形式一、一般形式: 函数类型函数类型 函数名函数名(形参类型形参类型 形参名形参名,. ) 作用作用:告诉编译系统告诉编译系统函数类型、参数个数及类型,以函数类型、参数个数及类型,以便检验便检验函数声明中,由于编译系统不函数声明中,由于编译系统不检查参数名,所以可以只写形检查参数名,所以可以只写形参的数据类型,而不写形参名参的数据类型,而不写形参名2022-5-23C语言程序设计语言程序设计24二、说明二、说明1、函数定义函数定义与与函数声明函数声明不同。不同。2、函数声明位

19、置函数声明位置:程序的数据说明部分,(程序的数据说明部分,(1)在)在主调函数中;(主调函数中;(2)在所有函数的外部(推荐使用)。)在所有函数的外部(推荐使用)。3、下列情况下,可不作函数下列情况下,可不作函数声声明明 (1)若函数返值是)若函数返值是char或或int型型,系统自动按系统自动按int型处理型处理 (2)被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前 有些系统有些系统( (如如Borland C+)Borland C+)要求函数声明指出函要求函数声明指出函数返值类型和形参类型,并且对数返值类型和形参类型,并且对void void 和和 intint 型函型函

20、数也要进行函数声明数也要进行函数声明2022-5-23C语言程序设计语言程序设计25例例3.9 函数声明举例函数声明举例#include void main() int a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);int max(int x, int y) int z; z=xy?x:y; return(z);int型函数可不作函数声明型函数可不作函数声明(Borland C+不行)不行)#include float add(float x, float y) float z; z=x+y; return(z

21、);void main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被调函数出现在主调函数被调函数出现在主调函数之前,不必函数声明之前,不必函数声明#include void main() float add(float,float); /*函数声明函数声明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);或或 f

22、loat add(float x,float y);函数声明在主调函数中函数声明在主调函数中#include double test1(int a, intb);int test2(char c, int d);char test3(double e, float f);void main()/*调用函数调用函数test1,test2,test3*、double test(int a, int b)int test2(char c, int d)char test3(double e, float f)函数的外部声明函数的外部声明2022-5-23C语言程序设计语言程序设计26一、一、 函数的

23、嵌套调用函数的嵌套调用C规定:规定:函数定义不可嵌套函数定义不可嵌套,但,但可以嵌套调用可以嵌套调用函数函数main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b例例 3.10 求三个数中最大数和最小数的差值求三个数中最大数和最小数的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min

24、=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数二、拓扑算法二、拓扑算法定义:函数直接或间接的调用自身叫函数的递归调用定义:函数直接或间接

25、的调用自身叫函数的递归调用f( )调调f调调f2调调f1f1( )f2( )int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);2022-5-23C语言程序设计语言程序设计29例例 3.11_1求求n的阶乘的阶乘(采用非递归算法采用非递归算法)#include int fac(int n) int f,i; f=1; for (i =1;i=n;i+) f=f*i; retur

26、n(f);void main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);) 1(12) 1() 1 , 0(1!nnnnn2022-5-23C语言程序设计语言程序设计30分析分析一般来说,将一般来说,将n!描述成为:描述成为:n!=1*2*3.*(n-1)*n但是,只要稍稍变换一下,就可以将其描述成为:但是,只要稍稍变换一下,就可以将其描述成为:n!=n*(n-1).3*2*1=n*(n-1)! 这样,一个整数的阶乘就被描述成为一个这样,一个整数的阶乘就被

27、描述成为一个规模规模较小的阶乘较小的阶乘与一个与一个数数的积。同样,可以将(的积。同样,可以将(n-1)!描述成(描述成(n-1)*(n-2)!。依次类推。于是,一个。依次类推。于是,一个问题就被描述成了一个较小规模的同样类型的问题问题就被描述成了一个较小规模的同样类型的问题了。了。 用递归的方法求用递归的方法求n!非法非法 n0 n!=递归的终止条件递归的终止条件递归方式递归方式4!=44!=4* *(4-1)(4-1)! ! 返回值返回值6 6返回值返回值2 2返回值返回值1 13!=33!=3* *(3-1)!(3-1)!2!=22!=2* *(2-1)!(2-1)!1!=11!=1主调

28、函数主调函数返回值返回值2424调调用用2022-5-23C语言程序设计语言程序设计32例例3.11_2 求求n的阶乘的阶乘(采用递归算法采用递归算法)#include int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);) 1()!1() 1 , 0

29、(1!nnnnn2022-5-23C语言程序设计语言程序设计33mainmain函数函数输入输入m m y=y=fac(mfac(m) )输出输出y y 调用调用facfacm mn n 因因 3!=0,13!=0,1f=3f=3* *fac(3-1)fac(3-1)返回返回f f 调用调用facfacm mn n 返回返回f f 返回返回f f 因因 2!=0,12!=0,1f=2f=2* *fac(2-1)fac(2-1)调用调用facfacm mn n 因因1=11=1 f=1 f=1结束结束递归调用过程递归调用过程:2022-5-23C语言程序设计语言程序设计34main() fac(

30、3) fac(2) fac(1)fac(3)*4 fac(2)*3 fac(1)*2 6 2 1 结果:结果:242022-5-23C语言程序设计语言程序设计35使用使用库函数库函数应注意:应注意:1、函数功能、函数功能2、函数参数的数目和顺序,及各参数意义和类型、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型、函数返回值意义和类型4、需要使用的包含文件、需要使用的包含文件 见教材例附录见教材例附录A2022-5-23C语言程序设计语言程序设计361、函数嵌套调用:、函数嵌套调用:main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b#include

31、int fac(int n) int f; if(n1) f=-1; else if(n=1|n=2) f=1; else f=fac(n-2)+fac(n-1); return(f);void main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); if(y=-1) printf(“Input error!n”); else printf(“%15d,y);2、函数递归调用:、函数递归调用:int fac(int n) int f,f1=1,f2=1,i; if(n1) f=-1; else if(n

32、=1|n=2) f=1; else for(i=3;i=n;i+) f=f1+f2;f1=f2;f2=f; return f; ) 2() 1() 2() 2 , 1(1)(nnfnfnnf2022-5-23C语言程序设计语言程序设计38 所谓变量的作用域是指该变量有效的区域。按照变量的作用所谓变量的作用域是指该变量有效的区域。按照变量的作用域,将域,将C语言的变量分为局部变量和全局变量。语言的变量分为局部变量和全局变量。一、局部变量一、局部变量-内部变量内部变量 位于一对花括号之间的所有语句称为一个代码块(也称为复位于一对花括号之间的所有语句称为一个代码块(也称为复合语句)。合语句)。n定义

33、定义:出现在代码块开始位置的变量。:出现在代码块开始位置的变量。n说明说明:n局部变量的作用域仅限于定义它的代码块内局部变量的作用域仅限于定义它的代码块内nmain中定义的变量只在中定义的变量只在main中有效中有效n不同函数中同名变量,占不同内存单元不同函数中同名变量,占不同内存单元n形参属于局部变量形参属于局部变量n可定义在复合语句中可定义在复合语句中,且只在该复合语句中且只在该复合语句中有效的变量有效的变量float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效有效x,y,i,j有效有

34、效m,n有效有效2022-5-23C语言程序设计语言程序设计39运行结果:运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4#include void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); void sub(); printf(main:a=%d,b=%dn,a,b);void sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例例 3.12不同函数中相同的变量不同函数中相同的变量2022-5-23C语言程序设计语言程序设计40例例 3.1

35、3复合语句中变量复合语句中变量#include #define N 5void main() int i;int temp=0; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai); printf(“n%dn”,temp);运行结果:运行结果:5 4 3 2 1temp=02022-5-23C语言程序设计语言程序设计41定义定义:任何在所有代码块之外定义的变量。:任何在所有代码块之外定义的变量。有效范围有效范围:从:从定义变量的位置开始定

36、义变量的位置开始到本源文件结束到本源文件结束 应尽量少使用全局变量,因为:应尽量少使用全局变量,因为:Y全局变量在程序全部执行过程中占用存储单元全局变量在程序全部执行过程中占用存储单元Y降低了函数的通用性、可靠性,可移植性降低了函数的通用性、可靠性,可移植性Y降低程序清晰性,容易出错降低程序清晰性,容易出错注意:若全局变量与局部变量同名,则全局变量被屏蔽!注意:若全局变量与局部变量同名,则全局变量被屏蔽!二、全局变量二、全局变量-外部变量外部变量说明说明:n全局变量的作用是增强函数之间联系的渠道全局变量的作用是增强函数之间联系的渠道n为便于区分全局与局部变量,将全局变量名的第一个字母为便于区分

37、全局与局部变量,将全局变量名的第一个字母大写大写2022-5-23C语言程序设计语言程序设计423、局部变量和全局变量、局部变量和全局变量main中定义的变量只在中定义的变量只在main中有效中有效不同函数中同名变量,占不同内存单元不同函数中同名变量,占不同内存单元形参属于局部变量形参属于局部变量可定义在复合语句中可定义在复合语句中,且只在该复合语句中且只在该复合语句中有效的变量有效的变量定义:在函数内定义,定义:在函数内定义,只在本函数内有效只在本函数内有效定义:在函数外定义,可为本文件所有函数共用定义:在函数外定义,可为本文件所有函数共用2022-5-23C语言程序设计语言程序设计43#i

38、nclude float Max=0,Min=100;float average(int n) int i; float s,aver1,sum=0; for(i=1;iMax) Max=s; else if(sMin) Min=s; sum+=s; return(sum/n);void main() int n; float aver2; scanf(“%d”,&n);/*输入班级人数输入班级人数*/ aver2=average(n); printf(“Max=%6.2fnMin=%6.2fn average=%6.2fn,Max,Min,aver2);作用域作用域MaxMin2022-5-

39、23C语言程序设计语言程序设计44例例3.15 全局变量定义与声明全局变量定义与声明#include int max(int x, int y) int z; z=xy?x:y; return(z);void main() printf(max=%d, max(a,b);int a=13,b=-8;运行结果:运行结果:max=13#include int a=13,b=-8;int max() int z; z=ab?a:b; return(z);void main() printf(max=%d,max();编译出错编译出错2022-5-23C语言程序设计语言程序设计45#include i

40、nt a=3,b=5;int max(int a, int b) int c; c=ab?a:b; return(c);void main() int a=8; printf(max=%d,max(a,b);例例 3.16 全局变量与局部变量重名时全局变量与局部变量重名时运行结果:运行结果:max=8a,b为全局变量为全局变量a,b为局部变量为局部变量a为局部变量为局部变量局部变量局部变量a全局变量全局变量b作用范围作用范围行参行参a、b作用范围作用范围2022-5-23C语言程序设计语言程序设计46#include int i;void main() void prt(); for(i=0;

41、i5;i+) prt();void prt() for(i=0;i5;i+) printf(“*”); printf(“n”);例例3.17 全局变量副作用全局变量副作用运行结果:运行结果:? *2022-5-23C语言程序设计语言程序设计47C语言中使用最广泛的一种类型。函数内凡是语言中使用最广泛的一种类型。函数内凡是未加类型说明的变量均视为自动变量。未加类型说明的变量均视为自动变量。2022-5-23C语言程序设计语言程序设计48说明说明: 自动变量的作用域仅限于定义该变量的个体内。自动变量的作用域仅限于定义该变量的个体内。 当程序执行到定义自动变量的代码块时,该自动当程序执行到定义自动变

42、量的代码块时,该自动变量才被创建,当程序的执行离开该代码块时,这些变量才被创建,当程序的执行离开该代码块时,这些自动变量便自行销毁,所以自动变量属于动态存储方自动变量便自行销毁,所以自动变量属于动态存储方式。式。 函数的形式参数也是自动变量。函数的形式参数也是自动变量。2022-5-23C语言程序设计语言程序设计49以前介绍的变量都存放在内存里。以前介绍的变量都存放在内存里。当一个变量频繁读写时,要反复访问内存,从而花费当一个变量频繁读写时,要反复访问内存,从而花费大量的存取时间。大量的存取时间。C语言提供另一种变量,即语言提供另一种变量,即寄存器变量。寄存器变量。存放在存放在CPU中,使用时

43、不访问内存,而直接从寄存器中读写。中,使用时不访问内存,而直接从寄存器中读写。2022-5-23C语言程序设计语言程序设计50例如:例如: register int x,y;寄存器变量属于动态存储方式,只有局部自动寄存器变量属于动态存储方式,只有局部自动变量和形式参数才可以定义为寄存器变量。变量和形式参数才可以定义为寄存器变量。 由于由于CPU中寄存器的个数是有限的,所以编中寄存器的个数是有限的,所以编译器可以忽略译器可以忽略register关键字,当有太多的变量关键字,当有太多的变量声明为声明为register时,只有个别的变量会存储在寄时,只有个别的变量会存储在寄存器中,其余的编译器会按普

44、通自动变量处理。存器中,其余的编译器会按普通自动变量处理。在变量的在变量的一般并不需要使用一般并不需要使用register关关键字。键字。2022-5-23C语言程序设计语言程序设计513、静态、静态static静态变量赋初值,只执行一次再次调用函数时保留静态变量赋初值,只执行一次再次调用函数时保留上次函数调用结束时的值。上次函数调用结束时的值。#include int add( );void main( )int i, result;for(i=1; i=3; i+)result = add();printf(%d , result);int add( )auto int num = 5;

45、/自动局部变量自动局部变量num+; return num; #include int add( );void main( )int i, result;for(i=1; i=3; i+)result = add();printf(%d , result);int add( )static int num = 5; /*静态局部变量静态局部变量*/num+; return num; 结果:结果:6 6 6结果:结果:6 7 82022-5-23C语言程序设计语言程序设计52静态局部变量在函数内定义,始终占用内存空间,静态局部变量在函数内定义,始终占用内存空间,直到整个源程序退出时才释放。直到整

46、个源程序退出时才释放。静态局部变量仅赋一次初值。静态局部变量仅赋一次初值。 静态局部变量虽然在整个源程序都存在,但是其静态局部变量虽然在整个源程序都存在,但是其作用域仍与自动变量相同,即只能在定义该变量的作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。继续存在,但不能使用它。 静态局部变量若在声明时未赋初值,则系统自动静态局部变量若在声明时未赋初值,则系统自动初始化为初始化为0(对数值型变量)或(对数值型变量)或0(对字符变(对字符变量)。量)。2022-5-23C语言程序设计语言程序设

47、计53如果一个文件中的全局变量不允许其他文件的函数如果一个文件中的全局变量不允许其他文件的函数引用,则该变量要用引用,则该变量要用static声明。或者说一个文件中的声明。或者说一个文件中的静态全局变量不允许其它文件中的函数引用。静态全局变量不允许其它文件中的函数引用。如果一个函数前用如果一个函数前用static声明,则这个函数不能被其声明,则这个函数不能被其他文件中的函数调用,称为他文件中的函数调用,称为内部函数或静态函数。内部函数或静态函数。static int sort;main() file1.c2022-5-23C语言程序设计语言程序设计544、外部声明、外部声明extern外部变量

48、是在函数的外部定义的全局变量。外部变量是在函数的外部定义的全局变量。(1)如果想在定义之前的函数中引用全局变量,)如果想在定义之前的函数中引用全局变量,则在函数中用关键字则在函数中用关键字extern声明。声明。 inta,b的作用域扩展到的作用域扩展到整个整个main函数函数(2 2)、如果一个)、如果一个C C程序有多个源程序文件组成,则程序有多个源程序文件组成,则一个文件定义了全局变量,则另一个文件如果要引一个文件定义了全局变量,则另一个文件如果要引用它的全局变量,就要用用它的全局变量,就要用externextern作声明;作声明; file1.c file2.cint sort;mai

49、n() extern int sort;int func() 2022-5-23C语言程序设计语言程序设计56(3 3)、如果一个函数前用)、如果一个函数前用externextern声明,则这个函数声明,则这个函数可以被其他文件中的函数调用,称为可以被其他文件中的函数调用,称为外部函数。外部函数。例:例:/*file1.c*/ main() int c,a=2; extern int fac(int x); c=fac(a); /*file2.c*/extern int fac(int x) 2022-5-23C语言程序设计语言程序设计57 指针变量指针变量就是存放变量地址的变量。就是存放变量

50、地址的变量。 变量的指针变量的指针就是变量的地址。就是变量的地址。举例:举例: int *p1, *p2,a; float *p3,b;例例3.3-1#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;2022-5-23C语言程序设计语言程序设计58指针变量作为函数的参数:指针变量作为函数的参数:说明说明 参数的传递是值传递,单向的(从

51、实参到形参)。那么如参数的传递是值传递,单向的(从实参到形参)。那么如何理解通过指针作为参数可以改变主调函数中变量的值呢?何理解通过指针作为参数可以改变主调函数中变量的值呢? 形参得到实参的值即一个地址,函数中可以通过形参引用形参得到实参的值即一个地址,函数中可以通过形参引用该地址,从而可以改变该地址对应变量的值。该地址,从而可以改变该地址对应变量的值。2022-5-23C语言程序设计语言程序设计59711x:y:调用前:调用前:调用结束:调用结束:711x:y:#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swap

52、ped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:调用:711a:b:711x:y:swap:711x:y:117a:b:temp2022-5-23C语言程序设计语言程序设计60例例3.18交换两个数的值交换两个数的值#include main() int x=7,y=11; printf(“Swapped:n); swap(x,y); printf(x=%d,y=%dn,x,y);swap(int a,int b) int temp; temp=a; a=

53、b; b=temp;输出:输出:#includevoid swap(int *px,int *py) int temp; temp=*px; *px=*py; *py=temp;main() int x=7,y=11,*p1,*p2; p1=&x; p2=&y; printf(“x=%d,y=%d”,x,y); printf(“Swapped:n”); swap(p1,p2); printf(“x=%d,y=%d”,x,y);例例3.19 求三个数中的最大值和平均值用函数实现:求三个数中的最大值和平均值用函数实现:void mav(int a,int b,int c,int *p1,float *p2) *p1=a; if(*p1b) *p1=b; if(*p1c) *p1=c; *p2=(a+b+c)/3.0; Return;main() int a,b,c,max,*p1; float ave,*p2;scanf(“%d%d%d”,&a,&b,&c); P1=&max;P2=&ave; mav(a,b,c,p1,p2); Printf(“max=%d,ave=%f”, max,ave););主函数的变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论