第7章 函数.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第7章 函数.ppt》由会员分享,可在线阅读,更多相关《第7章 函数.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 函数函数 理解并掌握函数的概念、定义和调用的方法和实质理解并掌握函数的概念、定义和调用的方法和实质掌握有参函数的数据传递方法,区分掌握有参函数的数据传递方法,区分“值传递值传递”与与“地址传递地址传递”理解标识符作用域和生成期的概念理解标识符作用域和生成期的概念理解并掌握存储类型的概念理解并掌握存储类型的概念理解并学会设计简单的递归函数理解并学会设计简单的递归函数 引言引言 函数可以实现程序的模块化,使得程序设计简单、函数可以实现程序的模块化,使得程序设计简单、直观,提高程序的可读性和可维护性,程序员还可直观,提高程序的可读性和可维护性,程序员还可以将一些常用的算法编写成通用函
2、数,以供随时调以将一些常用的算法编写成通用函数,以供随时调用。用。无论程序的设计规模有多大、多复杂,都是划分为无论程序的设计规模有多大、多复杂,都是划分为若干个相对独立、功能较单一的函数,通过对这些若干个相对独立、功能较单一的函数,通过对这些函数的调用,从而实现程序的功能。函数的调用,从而实现程序的功能。C C语言的函数分为库函数和用户自定义函数语言的函数分为库函数和用户自定义函数 7.1 案例:计算案例:计算(1)+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+4+5)#include#include intint sum(intsum(int n)n)intint i,si
3、,s=0;=0;for(i=1;i=n;i+)for(i=1;i=n;i+)s=s+i;s=s+i;return s;return s;void main()void main()intint s,is,i;for(ifor(i=1,s=0;i=5;i+)=1,s=0;i xy?x:yy?x:y;returnreturn 后面跟表达式。后面跟表达式。返回值的类型也可以是返回值的类型也可以是voidvoid类型,这种情况下可以写成:类型,这种情况下可以写成:returnreturn;也可以省略返回语句。也可以省略返回语句。参数参数:voidvoid 表示函数没有参数,通常把这种函数称为无参函数。
4、例表示函数没有参数,通常把这种函数称为无参函数。例如:如:intint sum(sum(voidvoid)intint i,si,s=0;=0;for(ifor(i=1,s=0;i=100;i+)s=s+i;=1,s=0;i=100;i+)s=s+i;return return s s 函数计算并返回函数计算并返回1 1到到100100之间的整数之和。之间的整数之和。参数参数:参数类型参数类型1 1 参数名参数名1,1,参数类型参数类型2 2 参数名参数名2,2,函数包含一个或多个参数,每个参数都必须标注具体的函数包含一个或多个参数,每个参数都必须标注具体的数据类型。这样的函数又称为有参函数。
5、例如:数据类型。这样的函数又称为有参函数。例如:intint sum(sum(intint n n)intint i,si,s=0;=0;for(ifor(i=1,s=0;i=1,s=0;i=n;in;i+)s=s+i;+)s=s+i;return return s s;函数计算并返回函数计算并返回1 1到到n n之间的整数之和。之间的整数之和。7.2.2 函数调用函数调用 函数调用的形式如下:函数调用的形式如下:函数名函数名(实参列表实参列表)例如:例如:s=sum(100)+sum(200);s=sum(100)+sum(200);s=sum(100+200);s=sum(100+200)
6、;s=s=sum(nsum(n););参数从调用的角度分为实际参数和形式参数,或简称参数从调用的角度分为实际参数和形式参数,或简称为实参和形参。实参和形参是一一对应的关系,参数为实参和形参。实参和形参是一一对应的关系,参数的个数和类型都必须一致。如果类型不一致将自动转的个数和类型都必须一致。如果类型不一致将自动转换,不能自动转换的将在编译或运行时出错。换,不能自动转换的将在编译或运行时出错。7.3 参考传递参考传递 实参向形参的参数传递有两种形式:实参向形参的参数传递有两种形式:值传递和地址传递。值传递和地址传递。值传递值传递是单向的数据传递,传递完成后,对形是单向的数据传递,传递完成后,对形
7、参的任何操作都不会影响实参。参的任何操作都不会影响实参。地址传递地址传递也可以说是单向的数据传递,但这种也可以说是单向的数据传递,但这种数据往往是变量、结构体、对象等的地址,对数据往往是变量、结构体、对象等的地址,对形参的操作会直接影响实参,从而使得这种形形参的操作会直接影响实参,从而使得这种形式上的式上的“单向单向”数据传递变成数据传递变成“双向双向”的的 7.3 参考传递参考传递【例例7-2】演示函数的参数传递演示函数的参数传递 void main()int x=10,y=20;int a10=1,2,3,4,5,6,7,8,9,10;int i,s=0;swap(x,y);/*值传递值传
8、递*/printf(x,y=%d(main)n,x,y);for(i=0;i 10;i+)s=s+ai;printf(s=%dn,s);s=0;change(a);/*地址传递地址传递*/for(i=0;i 10;i+)s=s+ai;printf(s=%dn,s);#include void swap(int a,int b)int t;t=a;a=b;b=t;printf(a,b=%d(swap)n,a,b);void change(int x10)int i;for(i=0;i10;i+)xi=xi+1;7.4 函数声明函数声明 函数的声明是对函数类型、名称等的函数的声明是对函数类型、名称
9、等的说明说明。对函数及其函。对函数及其函数体的建立称为函数的数体的建立称为函数的定义定义。对函数的说明可以和定义一。对函数的说明可以和定义一起完成,也可以只对函数的原型进行声明,这种声明通常起完成,也可以只对函数的原型进行声明,这种声明通常称为引用性声明,其格式如下:称为引用性声明,其格式如下:(););如:如:intint sum(intsum(int a,inta,int b);b);和完整的函数声明不同的是,形参表可以只给出形参的和完整的函数声明不同的是,形参表可以只给出形参的类型,如:类型,如:intint sum(int,intsum(int,int););形参名可以省略。形参名可以
10、省略。另外,这种声明是一条语句,后面的分号(另外,这种声明是一条语句,后面的分号(;)必不)必不可少。可少。声明和定义的区分声明和定义的区分变量的声明通常是对变量的类型和名称的一种说明,不一定变量的声明通常是对变量的类型和名称的一种说明,不一定会分配内存,而变量的定义肯定会分配内存空间。会分配内存,而变量的定义肯定会分配内存空间。函数的声明是对函数的类型和名称的一种说明,而函数的定函数的声明是对函数的类型和名称的一种说明,而函数的定义是一个模块,包括函数体部分。义是一个模块,包括函数体部分。声明可能也是定义,也可能不是。广义上的声明包括定义性声明可能也是定义,也可能不是。广义上的声明包括定义性
11、声明和引用性声明,我们通常所说的声明指的是后者。声明和引用性声明,我们通常所说的声明指的是后者。7.5 作用域作用域 作用域就是作用范围,不同作用域允许相同的作用域就是作用范围,不同作用域允许相同的标识符出现,同一作用域标识符不能重复,嵌标识符出现,同一作用域标识符不能重复,嵌套的作用域标识符由内向外屏蔽。套的作用域标识符由内向外屏蔽。7.5 作用域作用域标识符标识符a a共出现了共出现了3 3次。大圆次。大圆A A中的中的intint a a作用范围是整个程序;作用范围是整个程序;小圆小圆B B、D D中的中的intint a a分属分属B B、D D范围,而且都屏蔽了大圆范围,而且都屏蔽了
12、大圆A A中的中的a a,小圆,小圆C C可以直接访问大圆中的可以直接访问大圆中的intint a a;小圆小圆B B不能访问小圆不能访问小圆D D中中char dchar d,同样,小圆,同样,小圆D D不能访问小圆不能访问小圆B B中的中的char bchar b。B B、C C、D D都能访问大圆都能访问大圆A A中的中的char cchar c、intint sum(intsum(int n);n);小圆小圆B B、C C、D D可以理解成是可以理解成是3 3个函数或复合语句。在有些教个函数或复合语句。在有些教材中用材中用“块块”来表示一段相对独立的代码。来表示一段相对独立的代码。【例
13、例7-3】作用域演示作用域演示 int a=10;static int add(int a,int b)return a+b;main()int a,b,c;int i,s=0;int sub(int,int);extern int d;a=20;c=10;int a;int c=20;b=10;a=add(b,c);nprintf(a=%d,b=%d,c=%dn,a,b,c);for(i=1;i=100;i+)s=s+i;for(i=1;i=100;i+)s=sub(s,i);printf(s=%dn,s);printf(d=%dn,d);extern int sub(int a,int b
14、)return a-b;int d=888;int e=999;7.6 存储类型存储类型 从分配内存到被回收,变量的使用具有时效性,这就是变量从分配内存到被回收,变量的使用具有时效性,这就是变量的生存期。在整个程序运行过程中,不同存储类型的变量生的生存期。在整个程序运行过程中,不同存储类型的变量生存期也各有差异。存期也各有差异。一个程序在内存中占用的存储空间分为两个部分:程序区和一个程序在内存中占用的存储空间分为两个部分:程序区和数据区,数据区也可以分成静态数据区和动态数据区。数据区,数据区也可以分成静态数据区和动态数据区。生存期和作用域是不同的概念,分别从时间上和空间上对变生存期和作用域是不
15、同的概念,分别从时间上和空间上对变量的使用进行界定,相互关联又不完全一致,例如,静态变量的使用进行界定,相互关联又不完全一致,例如,静态变量的生存期贯穿整个程序,但作用域是从声明位置开始到文量的生存期贯穿整个程序,但作用域是从声明位置开始到文件结束。件结束。7.6 存储类型存储类型一个程序在内存中占用的存储空间分为两个部分:一个程序在内存中占用的存储空间分为两个部分:程序区和数据区,数据区也可以分成静态数据区和程序区和数据区,数据区也可以分成静态数据区和动态数据区动态数据区 7.6 存储类型存储类型变量的存储类型包括变量的存储类型包括:自动(自动(autoauto)寄存器(寄存器(regist
16、erregister)静态(静态(staticstatic)外部(外部(externextern)7.6.1 自动(自动(auto)类型)类型 autoauto用于局部变量的存储类型声明,可以省略,系统默认局用于局部变量的存储类型声明,可以省略,系统默认局部变量为部变量为autoauto类型。类型。autoauto类型变量是动态变量,声明时系统不会自动初始化,其类型变量是动态变量,声明时系统不会自动初始化,其值是随机的,所以必须在使用前初始化或赋值。下面的用法值是随机的,所以必须在使用前初始化或赋值。下面的用法是错误的:是错误的:intint add(intadd(int a,inta,int
17、 b)b)intint c;c;c=c+a+b;/*c=c+a+b;/*错误:错误:c c没有初始化没有初始化*/return c;return c;autoauto intint a;/*a;/*错误:外部变量不能声明为错误:外部变量不能声明为autoauto*/*/7.6.2 寄存器(寄存器(register)类型)类型 registerregister用于局部变量的存储类型声明,表示请求编译器尽可用于局部变量的存储类型声明,表示请求编译器尽可能直接分配使用能直接分配使用CPUCPU的寄存器,在寄存器满的情况下才分配的寄存器,在寄存器满的情况下才分配内存。这种类型的变量主要用于循环变量,可
18、以大大提高对内存。这种类型的变量主要用于循环变量,可以大大提高对这种变量的存取速度,从而提高程序效率。这种变量的存取速度,从而提高程序效率。能实际实现为能实际实现为registerregister类型的变量很少,主要是寄存器数量有类型的变量很少,主要是寄存器数量有限。限。7.6.3 静态(静态(static)类型)类型 staticstatic类型变量称为静态变量,存放在静态存储区。类型变量称为静态变量,存放在静态存储区。全局变量和局部变量都可以声明为全局变量和局部变量都可以声明为staticstatic类型,但意义不同。类型,但意义不同。全局变量总是静态存储,默认值为全局变量总是静态存储,默
19、认值为0 0。全局变量前加上。全局变量前加上staticstatic表示该变量只能在本程序文件内使用,其他文件无使用权限。表示该变量只能在本程序文件内使用,其他文件无使用权限。对于全局变量,对于全局变量,staticstatic关键字主要用于在程序包含多个文件关键字主要用于在程序包含多个文件时限制变量的使用范围,对于只有一个文件的程序有无时限制变量的使用范围,对于只有一个文件的程序有无staticstatic都是一样。都是一样。局部变量声明为局部变量声明为staticstatic类型,则要求系统对该变量采用静态类型,则要求系统对该变量采用静态存储的内存分配方式。值得注意的是,对这种存储的内存分
20、配方式。值得注意的是,对这种staticstatic类型的类型的局部变量,系统初始化只进行一次,多次遇到该声明语句,局部变量,系统初始化只进行一次,多次遇到该声明语句,将不再被执行。将不再被执行。【例例7-5】演示静态变量演示静态变量 intint s;s;static static intint t;/*t;/*其他文件不能使用其他文件不能使用*/main()main()intint sum(intsum(int););intint i;i;for(ifor(i=3;i=5;i+)=3;i=5;i+)s=s=sum(i);tsum(i);t=t+s;/*t=t+s;/*t自动初始化为自动初始
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 函数
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内