《c语言程序设计 第6章_函数.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计 第6章_函数.ppt(101页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计教程语言程序设计教程(第(第2版)版)第第6 6章章 函数函数C程序的结构:C程序结构说明:说明:说明:说明:1 1、一个、一个、一个、一个C C程序由一个或多个源程序文件组成。对较大程序由一个或多个源程序文件组成。对较大程序由一个或多个源程序文件组成。对较大程序由一个或多个源程序文件组成。对较大的程序,一般不希望全放在一个文件中,而是将函数的程序,一般不希望全放在一个文件中,而是将函数的程序,一般不希望全放在一个文件中,而是将函数的程序,一般不希望全放在一个文件中,而是将函数和其他内容(如预定义)分别放在若干个源文件中,和其他内容(如预定义)分别放在若干个源文件中,和其他内容(
2、如预定义)分别放在若干个源文件中,和其他内容(如预定义)分别放在若干个源文件中,再由若干个源文件组成一个再由若干个源文件组成一个再由若干个源文件组成一个再由若干个源文件组成一个C C程序。这样做可以分别程序。这样做可以分别程序。这样做可以分别程序。这样做可以分别编写、分别编译,从而提高效率。编写、分别编译,从而提高效率。编写、分别编译,从而提高效率。编写、分别编译,从而提高效率。(多个源文件中只能有一个是包含主函数的)(多个源文件中只能有一个是包含主函数的)(多个源文件中只能有一个是包含主函数的)(多个源文件中只能有一个是包含主函数的)2 2、一个源程序文件由一个或多个函数组成。一个源程、一个
3、源程序文件由一个或多个函数组成。一个源程、一个源程序文件由一个或多个函数组成。一个源程、一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序文件为单位进行序文件是一个编译单位,即以源程序文件为单位进行序文件是一个编译单位,即以源程序文件为单位进行序文件是一个编译单位,即以源程序文件为单位进行编译,而不是以函数为单位进行编译。编译,而不是以函数为单位进行编译。编译,而不是以函数为单位进行编译。编译,而不是以函数为单位进行编译。3 3、一个源程序文件可以为多个、一个源程序文件可以为多个、一个源程序文件可以为多个、一个源程序文件可以为多个C C程序共用。程序共用。程序共用。程
4、序共用。4 4、C C程序的执行总是从主函数程序的执行总是从主函数程序的执行总是从主函数程序的执行总是从主函数main()main()开始,调用其他开始,调用其他开始,调用其他开始,调用其他函数后返回到主函数,在主函数中结束整个程序的运函数后返回到主函数,在主函数中结束整个程序的运函数后返回到主函数,在主函数中结束整个程序的运函数后返回到主函数,在主函数中结束整个程序的运行。行。行。行。main()main()函数是系统定义的。函数是系统定义的。函数是系统定义的。函数是系统定义的。u C C语言语言是是函数式函数式语言语言;u 必须有且只能有一个名为必须有且只能有一个名为mainmain的主函
5、数的主函数,主函主函数数mainmain是必须的是必须的,其他函数的数目是不限的其他函数的数目是不限的;u C C程序的执行总是程序的执行总是从从mainmain函数开始,在函数开始,在mainmain中中结束结束;umainmain函数函数只调用其他函数只调用其他函数,但但不能被其他函数不能被其他函数所调用所调用;u如果不考虑函数的功能和逻辑如果不考虑函数的功能和逻辑,其他函数没有其他函数没有主从关系主从关系,可以相互调用可以相互调用;u所有函数所有函数都可以调用库函数都可以调用库函数;u所有函数都是平行的所有函数都是平行的,在定义时是相互独立的,在定义时是相互独立的,一个函数并不从属于另一
6、个,即一个函数并不从属于另一个,即函数函数不能嵌套定不能嵌套定义义,但但可以可以嵌套嵌套调用调用。C C语言程序的总体功能的实现:通过函数的调用来实现语言程序的总体功能的实现:通过函数的调用来实现语言程序的总体功能的实现:通过函数的调用来实现语言程序的总体功能的实现:通过函数的调用来实现C C语言的函数分为两类:语言的函数分为两类:语言的函数分为两类:语言的函数分为两类:系统定义的标准函数,又称为系统定义的标准函数,又称为系统定义的标准函数,又称为系统定义的标准函数,又称为库函数库函数库函数库函数。由系统提供由系统提供由系统提供由系统提供.此类函数此类函数此类函数此类函数不需要用户定义不需要用
7、户定义不需要用户定义不需要用户定义,也不必在程序中作说明也不必在程序中作说明也不必在程序中作说明也不必在程序中作说明,只需在程序开头只需在程序开头只需在程序开头只需在程序开头前用文件包含命令将包含有该函数原型的头文件包含进来前用文件包含命令将包含有该函数原型的头文件包含进来前用文件包含命令将包含有该函数原型的头文件包含进来前用文件包含命令将包含有该函数原型的头文件包含进来即可在程序中直接调用即可在程序中直接调用即可在程序中直接调用即可在程序中直接调用.这些函数总的可分为输入输出函数、这些函数总的可分为输入输出函数、这些函数总的可分为输入输出函数、这些函数总的可分为输入输出函数、数学函数、字符串
8、处理函数和内存函数等数学函数、字符串处理函数和内存函数等数学函数、字符串处理函数和内存函数等数学函数、字符串处理函数和内存函数等.如如如如:printfprintf()()、scanfscanf()()、putcharputchar()()、sqrtsqrt()()等。等。等。等。在调用该函数之前用在调用该函数之前用在调用该函数之前用在调用该函数之前用#include#include 命令将库函数信息包含到本程命令将库函数信息包含到本程命令将库函数信息包含到本程命令将库函数信息包含到本程序中。序中。序中。序中。常用的库函数请查阅附录常用的库函数请查阅附录常用的库函数请查阅附录常用的库函数请查阅
9、附录C C。使用使用库函数库函数应注意:应注意:1、了解函数功能、了解函数功能2、了解函数参数的数目和顺序,及各参数意义和类型、了解函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型、函数返回值意义和类型4、需要使用的文件包含命令,在程序的开头用、需要使用的文件包含命令,在程序的开头用#include 或或#include“*.h”说明。只有这样程序在编译、连接说明。只有这样程序在编译、连接时时Turboc才知道它是提供的库函数,否则,将认为是用才知道它是提供的库函数,否则,将认为是用户自己定义的函数而不能装配。户自己定义的函数而不能装配。(使用(使用printf()和和scan
10、f()这两函数时可省略)这两函数时可省略)自定义函数。自定义函数。自定义函数。自定义函数。按要求设计的。按要求设计的。C C语言程序设计的核心之一:语言程序设计的核心之一:语言程序设计的核心之一:语言程序设计的核心之一:自定义函数。自定义函数。自定义函数。自定义函数。按用户需求写的函数。此类函数不仅要在程序中定义按用户需求写的函数。此类函数不仅要在程序中定义按用户需求写的函数。此类函数不仅要在程序中定义按用户需求写的函数。此类函数不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进函数本身,而且在主调函数模块中还必须对该被调函数进函数本身,而且在主调函数模块中还必须对该被调函数
11、进函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明才能使用。行类型说明才能使用。行类型说明才能使用。行类型说明才能使用。printstarprintstarprintstarprintstar()()()()/*/*/*/*用户自定义的函数用户自定义的函数用户自定义的函数用户自定义的函数*/printfprintfprintfprintf(“*n*n*n*n”););););printsmessageprintsmessageprintsmessageprintsmessage()()()()/*/*/*/*用户自定义的函数用户自定义的函数用户自定义的函数用户自定义的函数*/pri
12、ntfprintfprintfprintf(“how do you do!n how do you do!n how do you do!n how do you do!n”););););main()main()main()main()printstarprintstarprintstarprintstar();();();();/*/*/*/*在主函数中调用自定义函数在主函数中调用自定义函数在主函数中调用自定义函数在主函数中调用自定义函数*/printsmessageprintsmessageprintsmessageprintsmessage();();();();/*/*/*/*在主函
13、数中调用自定义函数在主函数中调用自定义函数在主函数中调用自定义函数在主函数中调用自定义函数*/printstarprintstarprintstarprintstar();();();();/*/*/*/*在主函数中调用自定义函数在主函数中调用自定义函数在主函数中调用自定义函数在主函数中调用自定义函数*/程序运行结果:程序运行结果:程序运行结果:程序运行结果:*how do you do!how do you do!how do you do!how do you do!*从从从从C C语言中的函数功能角度来看语言中的函数功能角度来看语言中的函数功能角度来看语言中的函数功能角度来看,可分为有返
14、回值函可分为有返回值函可分为有返回值函可分为有返回值函数和无返回值函数数和无返回值函数数和无返回值函数数和无返回值函数:(1)(1)有返回值函数:此类函数被调用执行完后将向调有返回值函数:此类函数被调用执行完后将向调有返回值函数:此类函数被调用执行完后将向调有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果用者返回一个执行结果用者返回一个执行结果用者返回一个执行结果,称为返回值称为返回值称为返回值称为返回值.用户定义此用户定义此用户定义此用户定义此类函数时必须在函数定义和函数说明中明确说明类函数时必须在函数定义和函数说明中明确说明类函数时必须在函数定义和函数说明中明确说明类函数时必
15、须在函数定义和函数说明中明确说明返回值的类型返回值的类型返回值的类型返回值的类型.(若返回值是整型则定义时可以省(若返回值是整型则定义时可以省(若返回值是整型则定义时可以省(若返回值是整型则定义时可以省略类型)略类型)略类型)略类型)如如如如:sin():sin()、coscos()()等数学函数即属于此类函数等数学函数即属于此类函数等数学函数即属于此类函数等数学函数即属于此类函数(2)(2)无返回值函数:此类函数用于完成某项特定的处无返回值函数:此类函数用于完成某项特定的处无返回值函数:此类函数用于完成某项特定的处无返回值函数:此类函数用于完成某项特定的处理任务,执行完后不向调用者返回函数值
16、理任务,执行完后不向调用者返回函数值理任务,执行完后不向调用者返回函数值理任务,执行完后不向调用者返回函数值.用户定用户定用户定用户定义此类函数时可指定返回值的类型为义此类函数时可指定返回值的类型为义此类函数时可指定返回值的类型为义此类函数时可指定返回值的类型为“空类型空类型空类型空类型”,空类型的说明符为,空类型的说明符为,空类型的说明符为,空类型的说明符为“void”void”。从主调函数和被调函数之间传送的角度来看从主调函数和被调函数之间传送的角度来看从主调函数和被调函数之间传送的角度来看从主调函数和被调函数之间传送的角度来看,可分为无参可分为无参可分为无参可分为无参函数和有参函数函数和
17、有参函数函数和有参函数函数和有参函数:(1)(1)无参函数:此类函数在函数定义、函数说明及函数调无参函数:此类函数在函数定义、函数说明及函数调无参函数:此类函数在函数定义、函数说明及函数调无参函数:此类函数在函数定义、函数说明及函数调用中均不带参数,主调函数和被调函数之间不进行参数用中均不带参数,主调函数和被调函数之间不进行参数用中均不带参数,主调函数和被调函数之间不进行参数用中均不带参数,主调函数和被调函数之间不进行参数传递。此类函数一般用来完成一组特定的功能,可以返传递。此类函数一般用来完成一组特定的功能,可以返传递。此类函数一般用来完成一组特定的功能,可以返传递。此类函数一般用来完成一组
18、特定的功能,可以返回或不返回函数值。回或不返回函数值。回或不返回函数值。回或不返回函数值。注:注:注:注:若定义时没有返回值是若定义时没有返回值是若定义时没有返回值是若定义时没有返回值是“空类型空类型空类型空类型”,则函数返回值是,则函数返回值是,则函数返回值是,则函数返回值是存在的。若希望函数没有返回值,则在定义时就必须说存在的。若希望函数没有返回值,则在定义时就必须说存在的。若希望函数没有返回值,则在定义时就必须说存在的。若希望函数没有返回值,则在定义时就必须说明为空类型。明为空类型。明为空类型。明为空类型。如:如:如:如:dayingdaying()()/*/*若此句改为若此句改为若此句
19、改为若此句改为“void void dayingdaying()”,()”,则后面就不能输出值则后面就不能输出值则后面就不能输出值则后面就不能输出值*/printfprintf(“*n”);(“*n”);main()main()daying();printf(“%d”,dayingdaying();printf(“%d”,daying();();则运行结果为:则运行结果为:则运行结果为:则运行结果为:*4 4 /*/*这里是一个不确定的值这里是一个不确定的值*/(2)(2)有参函数:此类函数在定义及函数说明时都有参有参函数:此类函数在定义及函数说明时都有参有参函数:此类函数在定义及函数说明时都
20、有参有参函数:此类函数在定义及函数说明时都有参数,称为形式参数(简称形参)。在函数调用时也数,称为形式参数(简称形参)。在函数调用时也数,称为形式参数(简称形参)。在函数调用时也数,称为形式参数(简称形参)。在函数调用时也必须给出参数,称为实际参数(简称实参)。必须给出参数,称为实际参数(简称实参)。必须给出参数,称为实际参数(简称实参)。必须给出参数,称为实际参数(简称实参)。进行函数调用时,主调函数把实参的值传给被进行函数调用时,主调函数把实参的值传给被进行函数调用时,主调函数把实参的值传给被进行函数调用时,主调函数把实参的值传给被调函数的形参,供被调函数使用。调函数的形参,供被调函数使用
21、。调函数的形参,供被调函数使用。调函数的形参,供被调函数使用。本章节主要讲解用户自定义函数定义、调用等。本章节主要讲解用户自定义函数定义、调用等。本章节主要讲解用户自定义函数定义、调用等。本章节主要讲解用户自定义函数定义、调用等。6.1.1 函数的定义函数的定义自定义函数的形式:自定义函数的形式:存储类型符存储类型符 返回值类型符返回值类型符 函数名函数名(形参说明表形参说明表)几点说明:1.1.存储类型符存储类型符指的是函数的作用范围,只有两种形式:static和extern。static说明的函数称为内部函数内部函数,只能作用于其所在的源文件,extern说明的函数称为外部函数外部函数,可
22、被其他源文件中的函数调用。缺省情况为缺省情况为extern。2 2.返回值类型符返回值类型符返回值类型符返回值类型符 指的是函数体语句执行完成后,函数返回值的指的是函数体语句执行完成后,函数返回值的类型。类型。如如int,float,char等。等。若函数无返回值,则用空类型若函数无返回值,则用空类型void来定义函数的返回值。来定义函数的返回值。默认情况为默认情况为int型(有些编译器不支持默认情况)。型(有些编译器不支持默认情况)。3.3.函数名函数名由任何合法的标识符构成。由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。建议将函数名的命名与函数内容有一定关系。4.4.形参
23、说明表形参说明表是一系列用逗号分开的形参变量说明。是一系列用逗号分开的形参变量说明。如:如:int x,int y,int z 表示形参变量有表示形参变量有3个:个:x,y,z。类型都是。类型都是int型的。型的。注意:注意:不能直接写成:不能直接写成:int x,y,z。5.5.在古典式函数定义中,在古典式函数定义中,形参表形参表只要形参名,不要类型名。如:只要形参名,不要类型名。如:x,y,z 表示形参变量有表示形参变量有3个。形参的类型通过个。形参的类型通过形参说明形参说明语句说明。如:语句说明。如:int x,y,z。形参说明表形参说明表或或形参表形参表都可以缺省,缺省时表示函数无参数
24、。都可以缺省,缺省时表示函数无参数。6.函数语句体函数语句体是放在一对花括号 中,由局部数据类型描述和功能实现两部分组成。函数返回语句函数返回语句 通常用返回语句返回语句来结束函数的调用。两种形式的返回语句:函数无返回值的情况 return;函数有返回值的情况 return(表达式的值);例例 无参函数无参函数 printstar()printf(“*n”);或或 printstar(void)printf(“*n”);例:例:有参函数(现代风格)有参函数(现代风格)int max(int x,y)int z;z=xy?x:y;return(z);例例:空函数空函数dummy()函数体为空函数
25、体为空函数的定义的几种不同形式:函数的定义的几种不同形式:函数类型函数类型 函数名函数名(形参类型说明表形参类型说明表)说明部分说明部分语句部分语句部分u现代风格:现代风格:例:例:有参函数(现代风格)有参函数(现代风格)int max(int x,int y)int z;z=xy?x:y;return (z);函数类型函数类型 函数名(形参表)函数名(形参表)形参类型说明形参类型说明 说明部分说明部分 语句部分语句部分u传统风格传统风格:例例:有参函数(传统风格):有参函数(传统风格)int max(x,y)int x,y;int z;z=xy?x:y;return(z);例如,编写自定义函
26、数abs_sum(),求两个任意整数的绝对值的和。int abs_sum(int m,int n)if(m0)m=m;if(n0)n=n;return(m+n);或直接调用系统函数来实现:int abs_sum(int m,int n)return(abs(m)+abs(n);注意:注意:函数abs()的声明在头文件math.h。例:定义函数例:定义函数power(x,n),求求x的的n次方。次方。函数定义如下函数定义如下:float power(float x,float power(float x,intint n)n)intint i;i;float t=1;float t=1;for(
27、i=1;i=n;i+)for(i=1;iy)m=x;y)m=x;else m=y;else m=y;if(zif(zm)m=z;m)m=z;return z;return z;自定义函数在程序中的使用方式有两种形式:自定义函数在程序中的使用方式有两种形式:自定义函数在程序中的使用方式有两种形式:自定义函数在程序中的使用方式有两种形式:先进行先进行先进行先进行函数声明函数声明函数声明函数声明,再进行,再进行,再进行,再进行函数函数函数函数调用,函数定义调用,函数定义调用,函数定义调用,函数定义放在放在放在放在mainmain函数函数函数函数的后面。的后面。的后面。的后面。函数定义函数定义放在放在
28、mainmain函数的前面,函数的前面,再进行再进行函数调用函数调用。(不需要进行函数声明不需要进行函数声明)例例例例1 1:编写程序,通过调用函数编写程序,通过调用函数intint abs_sum(intabs_sum(int a,inta,int b)b),求任意两个整数的绝对值的和。求任意两个整数的绝对值的和。#include int abs_sum(int m,int n);/*函数声函数声明明*/main()int x,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);/*函数调用函数调用*/printf(|%d|+|%d|=%dn,x,y,z);int ab
29、s_sum(int m,int n)/*函数定函数定义义*/if(m0)m=-m;if(n0)n=-n;return m+n;或者:或者:#include int abs_sum(int m,int n)/*函数定义函数定义*/if(m0)m=-m;if(n0)n=-n;return m+n;main()int x,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);/*函数调用函数调用*/printf(|%d|+|%d|=%dn,x,y,z);对被调用函数的声明和函数原型对被调用函数的声明和函数原型对被调用函数要求:对被调用函数要求:对被调用函数要求:对被调用函数要求:
30、必须是必须是必须是必须是已存在已存在已存在已存在的函数(库函数或的函数(库函数或的函数(库函数或的函数(库函数或用户自定义函数用户自定义函数用户自定义函数用户自定义函数)若是使用库函数,则应在本文件的开头用若是使用库函数,则应在本文件的开头用若是使用库函数,则应在本文件的开头用若是使用库函数,则应在本文件的开头用:#include#include 命令将调用有关命令将调用有关命令将调用有关命令将调用有关库函数所需用到库函数所需用到库函数所需用到库函数所需用到的信息的信息的信息的信息“包含到该文件中来。否则就无法使用库包含到该文件中来。否则就无法使用库包含到该文件中来。否则就无法使用库包含到该文
31、件中来。否则就无法使用库函数。函数。函数。函数。若是若是若是若是用户自定义函数用户自定义函数用户自定义函数用户自定义函数,而且主调函数与被调函数,而且主调函数与被调函数,而且主调函数与被调函数,而且主调函数与被调函数在同一个文件中,一般还需在主调函数中对被调在同一个文件中,一般还需在主调函数中对被调在同一个文件中,一般还需在主调函数中对被调在同一个文件中,一般还需在主调函数中对被调函数作声明,即向编译系统声明将要调用此函数。函数作声明,即向编译系统声明将要调用此函数。函数作声明,即向编译系统声明将要调用此函数。函数作声明,即向编译系统声明将要调用此函数。函数声明函数声明函数声明函数声明 一般形
32、式:一般形式:一般形式:一般形式:函数类型函数类型函数类型函数类型 函数名函数名函数名函数名(形参类型形参类型形参类型形参类型11形参名形参名形参名形参名1,.1,.););或:或:或:或:函数类型函数类型函数类型函数类型 函数名函数名函数名函数名();();(不提倡使用)(不提倡使用)(不提倡使用)(不提倡使用)作用:告诉编译系统作用:告诉编译系统作用:告诉编译系统作用:告诉编译系统函数类型、参数个数及类型,以便函数类型、参数个数及类型,以便函数类型、参数个数及类型,以便函数类型、参数个数及类型,以便检验检验检验检验 函数定义与函数声明不同函数定义与函数声明不同函数定义与函数声明不同函数定义
33、与函数声明不同 函数声明位置:函数声明位置:函数声明位置:函数声明位置:程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)下列情况下,可不作函数声明下列情况下,可不作函数声明下列情况下,可不作函数声明下列情况下,可不作函数声明 若函数返值是若函数返值是若函数返值是若函数返值是charchar或或或或intint型型型型,系统自动按,系统自动按,系统自动按,系统自动按intint型处理型处理型处理型处理 被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前被调用函数定义出现在
34、主调函数之前 在所有的函数定义之前,在函数的外部已做了函数在所有的函数定义之前,在函数的外部已做了函数在所有的函数定义之前,在函数的外部已做了函数在所有的函数定义之前,在函数的外部已做了函数声明声明声明声明 有些系统有些系统有些系统有些系统(如如如如Borland C+)Borland C+)要求函数声明指出函数返回要求函数声明指出函数返回要求函数声明指出函数返回要求函数声明指出函数返回值类型和形参类型,并且对值类型和形参类型,并且对值类型和形参类型,并且对值类型和形参类型,并且对void void 和和和和 intint 型函数也要进行型函数也要进行型函数也要进行型函数也要进行函数声明函数声
35、明函数声明函数声明#include main()float add(float x,float y);/*函数声明函数声明*/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);例:例:函数声明举例函数声明举例#include float add(float x,float y)float z;z=x+y;return(z);main()float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);pri
36、ntf(sum is%f,c);被调函数出现在主调函数之前,被调函数出现在主调函数之前,不必函数声明不必函数声明#include main()int a,b;int c;scanf(%d,%d,&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 long sum(int a,int b);long factorial(int n);main()int n1,n2;long a;scanf(
37、%d,%d,&n1,&n2);a=sum(n1,n2);printf(a=%1d,a);long sum(int a,int b)long c1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);long factorial(int n)long rtn=1;int i;for(i=1;iy?x:y;return(z);例例:比较两个数并输出大者比较两个数并输出大者#include main()int a,b,c;int max(int x,int y);/*对被调函数的声明对被调函数的声明*/scanf(%d,%d,&a,&b);c=max(a
38、,b);printf(Max is%d,c);int max(int x,int y)int z;z=xy?x:y;return(z);形参形参实参实参说明:说明:说明:说明:实实实实参参参参可可可可以以以以是是是是常常常常量量量量、变变变变量量量量或或或或表表表表达达达达式式式式,但但但但必必必必须须须须有有有有确确确确定定定定的的的的值值值值。在调用时将实参的值赋给形参。在调用时将实参的值赋给形参。在调用时将实参的值赋给形参。在调用时将实参的值赋给形参。在在在在定定定定义义义义函函函函数数数数时时时时形形形形参参参参必必必必须须须须指指指指定定定定类类类类型型型型;在在在在定定定定义义义义
39、函函函函数数数数中中中中指指指指定定定定的的的的形形形形参参参参未未未未出出出出现现现现函函函函数数数数调调调调用用用用时时时时,并并并并不不不不占占占占据据据据内内内内存存存存中中中中的的的的存存存存储储储储单单单单元元元元;只只只只有有有有在在在在发发发发生生生生函函函函数数数数调调调调用用用用时时时时,函函函函数数数数中中中中的的的的形形形形参参参参才才才才被被被被分分分分配配配配内内内内存存存存单单单单元;调用结束后,形参所占的内存单元也同时被释放。元;调用结束后,形参所占的内存单元也同时被释放。元;调用结束后,形参所占的内存单元也同时被释放。元;调用结束后,形参所占的内存单元也同时被
40、释放。形参与实参应形参与实参应形参与实参应形参与实参应类型一致,个数相同。类型一致,个数相同。类型一致,个数相同。类型一致,个数相同。若形参与实参类型若形参与实参类型若形参与实参类型若形参与实参类型不一致,自动按形参类型转换不一致,自动按形参类型转换不一致,自动按形参类型转换不一致,自动按形参类型转换 (函数调用转换)。函数调用转换)。函数调用转换)。函数调用转换)。在调用函数时,主调函数与被调函数之间有数据的传递,在调用函数时,主调函数与被调函数之间有数据的传递,在调用函数时,主调函数与被调函数之间有数据的传递,在调用函数时,主调函数与被调函数之间有数据的传递,具体有两种传递方式:单向的值传
41、递与地址传递。具体有两种传递方式:单向的值传递与地址传递。具体有两种传递方式:单向的值传递与地址传递。具体有两种传递方式:单向的值传递与地址传递。单向的值传递:单向的值传递:单向的值传递:单向的值传递:将实参的值单向传递给形参的一种参数传递方式。如将实参的值单向传递给形参的一种参数传递方式。如将实参的值单向传递给形参的一种参数传递方式。如将实参的值单向传递给形参的一种参数传递方式。如果形参是普通变量,则是果形参是普通变量,则是果形参是普通变量,则是果形参是普通变量,则是单向的值传递方式单向的值传递方式单向的值传递方式单向的值传递方式,此时形参值,此时形参值,此时形参值,此时形参值的变化不会影响
42、实参的值;函数调用时的变化不会影响实参的值;函数调用时的变化不会影响实参的值;函数调用时的变化不会影响实参的值;函数调用时,为形参分配单元为形参分配单元为形参分配单元为形参分配单元,并将实参的值传递到形参中,形参与实参分别占据不同的并将实参的值传递到形参中,形参与实参分别占据不同的并将实参的值传递到形参中,形参与实参分别占据不同的并将实参的值传递到形参中,形参与实参分别占据不同的内存单元内存单元内存单元内存单元 ;调用结束,形参单元被释放,实参单元仍保;调用结束,形参单元被释放,实参单元仍保;调用结束,形参单元被释放,实参单元仍保;调用结束,形参单元被释放,实参单元仍保留并维持原值。留并维持原
43、值。留并维持原值。留并维持原值。地址传递:地址传递:地址传递:地址传递:将实参地址传递给形参的一种方式。如果形参是数组将实参地址传递给形参的一种方式。如果形参是数组将实参地址传递给形参的一种方式。如果形参是数组将实参地址传递给形参的一种方式。如果形参是数组名(或指针变量),则传递的是数组的首地址而不是数组名(或指针变量),则传递的是数组的首地址而不是数组名(或指针变量),则传递的是数组的首地址而不是数组名(或指针变量),则传递的是数组的首地址而不是数组的值。此时若形参中的数据发生变化就又可能影响实参中的值。此时若形参中的数据发生变化就又可能影响实参中的值。此时若形参中的数据发生变化就又可能影响
44、实参中的值。此时若形参中的数据发生变化就又可能影响实参中的数据的值。的数据的值。的数据的值。的数据的值。7 71111x:x:y:y:调用前:调用前:调用结束:调用结束:7 71111x:x:y:y:例例:输入两个数输入两个数,交换两个数交换两个数,输出交换前和交换后的两数输出交换前和交换后的两数.#include main()int x=7,y=11;printf(x=%d,y=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,y=%dn,x,y);swap(int a,int b)int temp;temp=a;a=b;b=temp;调用:调
45、用:7 71111a:a:b:b:7 71111x:x:y:y:swap:swap:7 71111x:x:y:y:11117 7a:a:b:b:temptemp11117 7a:a:b:b:运行结果:运行结果:x=7,y=11 swapped:x=7,y=11值传递方式值传递方式:单向的值传递单向的值传递阅读:阅读:课本上的例课本上的例6-1、6-2、6-3函数的返回值返回值返回语句返回语句返回语句返回语句形式:形式:形式:形式:return(return(表达式表达式表达式表达式);或或或或 return return 表达式表达式表达式表达式;或或或或 return;return;功能:使
46、程序控制从被调用函数返回到功能:使程序控制从被调用函数返回到功能:使程序控制从被调用函数返回到功能:使程序控制从被调用函数返回到主主主主调函数中,调函数中,调函数中,调函数中,同时把返同时把返同时把返同时把返回回回回值带给值带给值带给值带给主主主主调函数调函数调函数调函数说明:说明:说明:说明:函数中可有多个函数中可有多个函数中可有多个函数中可有多个returnreturn语句语句语句语句 若无若无若无若无returnreturn语句,遇语句,遇语句,遇语句,遇 时,自动返回调用函数时,自动返回调用函数时,自动返回调用函数时,自动返回调用函数 若若若若函数类型函数类型函数类型函数类型与与与与r
47、eturnreturn语句中表达式值的类型不一致,按前语句中表达式值的类型不一致,按前语句中表达式值的类型不一致,按前语句中表达式值的类型不一致,按前者为准,自动转换者为准,自动转换者为准,自动转换者为准,自动转换-函数调用转换函数调用转换函数调用转换函数调用转换 voidvoid型函数型函数型函数型函数用来明确表明函数不带回任何值用来明确表明函数不带回任何值用来明确表明函数不带回任何值用来明确表明函数不带回任何值例例:无返回值函数:无返回值函数void swap(int x,int y)int temp;temp=x;x=y;y=temp;例:例:函数返回值类型自动转换为函数类型函数返回值类
48、型自动转换为函数类型#include main()float a,b;int c;int max(float x,float y);/*函数声明函数声明*/scanf(%f,%f,&a,&b);c=max(a,b);printf(Max is%dn,c);int max(float x,float y)float z;z=xy?x:y;return(z);运行结果:运行结果:1.5,4.7Max is 46.2 变量的作用域和存储类型1变量的作用域变量的作用域变量从变量从变量从变量从数据类型角度数据类型角度数据类型角度数据类型角度来分,可分为基本数据类型来分,可分为基本数据类型来分,可分为基本
49、数据类型来分,可分为基本数据类型(整型、实型、字符型和枚举类型)、构造数据(整型、实型、字符型和枚举类型)、构造数据(整型、实型、字符型和枚举类型)、构造数据(整型、实型、字符型和枚举类型)、构造数据类型(数组、结构体、共用体)、指针类型与空类型(数组、结构体、共用体)、指针类型与空类型(数组、结构体、共用体)、指针类型与空类型(数组、结构体、共用体)、指针类型与空类型。类型。类型。类型。从从从从变量的作用范围(空间角度)变量的作用范围(空间角度)变量的作用范围(空间角度)变量的作用范围(空间角度)来分,又可分为来分,又可分为来分,又可分为来分,又可分为局部变量与全局变量局部变量与全局变量局部
50、变量与全局变量局部变量与全局变量从从从从变量存在的时间长短(变量的生存期)变量存在的时间长短(变量的生存期)变量存在的时间长短(变量的生存期)变量存在的时间长短(变量的生存期)来分,来分,来分,来分,又可分为动态存储变量与静态存储变量(下节介又可分为动态存储变量与静态存储变量(下节介又可分为动态存储变量与静态存储变量(下节介又可分为动态存储变量与静态存储变量(下节介绍)绍)绍)绍)(1)局部变量)局部变量局部变量也称为内部变量局部变量也称为内部变量局部变量也称为内部变量局部变量也称为内部变量 定义:在定义:在定义:在定义:在函数函数函数函数内部或某个控制块的内部定义的变内部或某个控制块的内部定