C语言经典教程8讲(3-25).ppt
《C语言经典教程8讲(3-25).ppt》由会员分享,可在线阅读,更多相关《C语言经典教程8讲(3-25).ppt(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 概述概述2 函数定义的一般形式函数定义的一般形式 参数参数和和返回值返回值3 函数的调用函数的调用 函数原型函数原型 嵌套调用、递归调用嵌套调用、递归调用第八章第八章 函数函数14 数组数组作为函数的参数作为函数的参数5 局部变量和全局变量局部变量和全局变量6 变量的存储类别变量的存储类别 静态存储方式静态存储方式与与动态存储方式动态存储方式7 内部函数与外部函数内部函数与外部函数2C C程序结构程序结构1 概概 述述3 C函数的分类(函数的分类(从用户使用的角度分类)从用户使用的角度分类)库函数库函数由系统提供,由系统提供,printf(),sqrt().用户自定义函数用户自定义函数用户
2、自己编写用户自己编写#include int add(int x,int y)return(x+y);main()int a,b,sum;sum=add(a,b);printf(“sum=%d”,sum);add()是自定义函数是自定义函数Printf()是库函数是库函数41、函数的概念、函数的概念从外部来看,函数就是一个数据加工厂。从外部来看,函数就是一个数据加工厂。/*自定义函数自定义函数*/int max(int x,int y)int z;z=xy?x:y;return z;c=max(a,b);传送数据返回结果2、采用自定义函数的意义、采用自定义函数的意义 符合结构化设计思想,符合结
3、构化设计思想,每个自定义函数完成一个功能,每个自定义函数完成一个功能,可单独编译,可单独编译,便于设计、调试。便于设计、调试。一个函数可被多次调用,避免在程序中设计重复的代码一个函数可被多次调用,避免在程序中设计重复的代码。51.有参函数的定义有参函数的定义 类型标识符 函数名(形式参数表)函数头 局部声明 函数体 执行语句 2.无参函数的定义无参函数的定义 类型标识符 函数名()局部声明 执行语句 2 函数定义的一般形式函数定义的一般形式6例如:例如:/*定义无参函数定义无参函数*/*定义有参函数定义有参函数*/void star()int max(int x,int y)int z;pri
4、ntf(“*n”);z=xy?x:y;return(z);函数定义时,注意:函数定义时,注意:函数名的括号后无函数名的括号后无“;”必须指明每个必须指明每个参数的类型参数的类型,和,和函数值的类型函数值的类型.函数值类型函数值类型:函数返回值的类型。:函数返回值的类型。如:如:int float char void 等等,缺省按,缺省按整型整型处理。处理。无返回值的函数,函数值类型用无返回值的函数,函数值类型用void.73.函数的参数和函数返回值函数的参数和函数返回值形式参数形式参数 简称实参,主调函数中提供的数据。简称实参,主调函数中提供的数据。实际参数实际参数 简称形参,被调函数中用以接
5、收主调函数数据的简称形参,被调函数中用以接收主调函数数据的 变量。变量。函数返回值函数返回值c=max(a,b);(main 函数)函数)实参实参 a,b(max 函数)函数)形参形参x,y 返回值返回值 zmax(int x,int y)int z;z=xy?x:y;return(z);8main()int a,b,c;scanf(%d%d”,&a,&b);c=max(a,b);实参实参 printf(“Max is%d n”,c);int max(int x,int y)形参形参 int z;z=xy?x:y;return(z);输入:输入:-100 200-100 200输出:输出:Ma
6、x is 200Max is 200 例:例:调用函数时的数据传递调用函数时的数据传递9n关于参数的说明:关于参数的说明:1、形参和实参的对应:形参和实参的个数要一样多,位置一、形参和实参的对应:形参和实参的个数要一样多,位置一一对应,类型要匹配一对应,类型要匹配 如:如:d=max(7.8,10.2);/*实、形参类型不一致实、形参类型不一致*/m=max(a,b,c);/*实、形参个数不一致实、形参个数不一致*/2、实参可以是常量、变量、表达式,总之、实参可以是常量、变量、表达式,总之要有确定的值。要有确定的值。如如 max(2,b+c)3、实参对形参的数据传递是、实参对形参的数据传递是“
7、值传递值传递”,即单向传递。,即单向传递。当当函数调用时,将函数调用时,将实参的值传递给形参实参的值传递给形参,而不能由形参传递,而不能由形参传递给实参。给实参。若是数组名,则传送的是数组的首地址。若是数组名,则传送的是数组的首地址。10参数传递举例:参数传递举例:利用自定义函数,找出三个数中的最大数。利用自定义函数,找出三个数中的最大数。main()int a,b,c,d;scanf(%d,%d,%d,&a,&b,&c);d=max(a,b);/*a、b的值作为实参的值作为实参*/d=max(d,c);/*d、c的值作为实参的值作为实参*/printf(Max is%dn,d);max(in
8、t x,int y)int z;z=xy?x:y;return(z);/*z值作为返回值值作为返回值*/118585812812假设输入a,b,c 的值:8,5,121)函数调用前,形参不占内存单元;函数调用后,形参占用的存储单元将被释放;例中第一次调用:实参:a b d=max(a,b);int max(int x,int y)形参:x y第二次调用:实参:d c d=max(d,c);形参:x y 122)实参和形参占据不同的存储单元,因此在被调函数中给形参变量赋值,不会对实参造成任何影响。13例:例:形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元 main()int a=2
9、,b=3;printf(“a=%d,b=%d n”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);add(a,b);printf(“a=%d,b=%dn”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);add(int x,int y)x=x+8;y=y+12;printf(“x=%d,y=%d n”,x,y);printf(“&x=%x,&y=%xn”,&x,&y);14main()int a,b,t;scanf(“%d%d”,&a,&b);t=a;a=b;b=t;printf(“%d,%d”,a,b);输入:3 5输出:5,3例:交换两个数,例:交
10、换两个数,a和和b35abt353main()void swap(int,int);int a,b;scanf(“%d%d”,&a,&b);swap(a,b);printf(“%d,%d”,a,b);void swap(int x,int y)int t;t=a;a=b;b=t;输入:3 5输出:3,5x,y交换了,但交换了,但a,b的值不变的值不变154、由于实参和形参各有各的存储单元,因而实参和 形参可以同名,互不干扰;5、调用无参函数,无数据传送。16函数的返回值函数的返回值若返回一个值:可用return返回语句实现;若需返回多个值:则需要使用其它手段实现;如:指针、全局变量返回语句的一
11、般形式:返回语句的一般形式:return(表达式);c=max(a,b);(main 函数)(max 函数)max(int x,int y)int z;z=xy?x:y;return(z);17使用说明:使用说明:一个自定义函数中可以有一个以上的一个自定义函数中可以有一个以上的return语句;语句;这常用于分支结构的不同出口,但只可能有一个被执行。这常用于分支结构的不同出口,但只可能有一个被执行。如上例:如上例:if(xy)return(x);else return(y);若函数不需要用若函数不需要用return语句返回值,其类型应采用语句返回值,其类型应采用void(空类型)标识符;(空类
12、型)标识符;void printstar()printf(*n);该函数不需要参数,也没有返回值。该函数不需要参数,也没有返回值。18return后表达式值的类型一般应与定义函数的类型一后表达式值的类型一般应与定义函数的类型一致;若不一致,则以定义函数时的类型为准自动转换。致;若不一致,则以定义函数时的类型为准自动转换。如:如:int add(int x,int y)int sum;return(sum);/*若若 float sum;值为实型,自动转为值为实型,自动转为int型返回型返回*/191.函数调用的一般形式函数调用的一般形式 函数名(实参表)函数名()注意:注意:多个实参逗号分隔;
13、调用无参函数,()不能省 如:如:c=max(a,b);printf(“%d”,sum);print();3 函数的调用函数的调用202、函数调用的三种方法、函数调用的三种方法 1).函数语句:函数语句:如:如:print();2).函数表达式:函数调用出现在表达式中,要求函数表达式:函数调用出现在表达式中,要求函数返回一个确定值,以参加表达式的运算。函数返回一个确定值,以参加表达式的运算。如:如:c=2*max(a,b);3).函数参数:函数调用作为另一个函数的参数,函数参数:函数调用作为另一个函数的参数,如:如:m=max(a,max(b,c);printf(“%d”,max(a,b);2
14、13 3、函数调用成功的前提条件、函数调用成功的前提条件1.1.被调函数必须被调函数必须存在存在(标准或用户定义)。(标准或用户定义)。2.2.若若调调用用的的是是库库函函数数,应应在在文文件件开开头头用用#include#include命命令令包包含含对对应的头文件。应的头文件。如:如:#include “stdio.h”#include “math.h”3 3.若若调调用用的的是是自自定定义义函函数数,一一般般应应在在主主调调函函数数中中对对被被调调函函数数的类型作声明。的类型作声明。(函数原型)(函数原型)形式:形式:函数类型函数类型 函数名函数名(参数类型参数类型1,1,参数类型参数类
15、型2 2););或者或者函数类型函数类型 函数名函数名(参数类型参数类型1,参数名参数名1,参数类型参数类型2,参数名参数名2);22例例:在主调函数中,对被调用的自定义函数做说明在主调函数中,对被调用的自定义函数做说明 main()float add(float x,float y);/*对被调函数的声明对被调函数的声明*/float a,b,c;scanf(%f%f”,&a,&b);c=add(a,b);/*调用调用add函数函数*/printf(“sum is%f n”,c);float add(float x,float y)/*自定义函数自定义函数*/float z;z=x+y;re
16、turn(z);输入:输入:3.6 6.5 输出:输出:sum is 10.10000float add(float,float)注意:对函数的注意:对函数的“定义定义”和和“声明声明”不是一回事不是一回事23问题:为什么要对被调函数做声明?问题:为什么要对被调函数做声明?提前向编译系统声明将要调用此函数,并将被调函数的提前向编译系统声明将要调用此函数,并将被调函数的有关信息(函数名、函数类型以及形参的类型、个数和顺有关信息(函数名、函数类型以及形参的类型、个数和顺序)通知编译系统,以便系统进行对照检查序)通知编译系统,以便系统进行对照检查。防止运行错误。防止运行错误。特别地,以下两种情况可以
17、省略在主调函数中对被调函数特别地,以下两种情况可以省略在主调函数中对被调函数的声明。的声明。1)被调函数定义在主调函数之前)被调函数定义在主调函数之前2)在)在main函数外部,文件的开头处已经对被调函数作过说函数外部,文件的开头处已经对被调函数作过说明明24例例1 1:被调函数出现在主调函数之前,则在主调函:被调函数出现在主调函数之前,则在主调函数中不必声明。数中不必声明。输入:输入:3.6 6.5 输出:输出:sum is 10.100000float add(float x,float y)float z;z=x+y;return(z);main()float a,b,c;scanf(“
18、%f%f”,&a,&b);c=add(a,b);printf(“%f n”,c);25例例2:在文件开头对被调函数声明:在文件开头对被调函数声明 char letter(char,char);float f(float,float);/*声明*/main()/*调用letter函数,f函数*/letter(c1,c2);f(x,y);char letter(char c1,char c2)/*定义letter函数*/float f(float x,float y)/*定义f函数*/264、函数的嵌套调用函数的嵌套调用 注意:函数调用结束后是一级一级的返回调用处注意:函数调用结束后是一级一级的返
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 经典 教程 25
限制150内