第七章新11年5月25日.ppt





《第七章新11年5月25日.ppt》由会员分享,可在线阅读,更多相关《第七章新11年5月25日.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 第七章 函数及变量存储类别 1第第七七章章 函数及变量存储类别函数及变量存储类别 v本章要求本章要求理解模块化程序设计思想;理解模块化程序设计思想;掌握函数的定义与调用方法;掌握函数的定义与调用方法;掌握掌握C语言的参数传递方式;语言的参数传递方式;掌握变量的作用域和存储方式。掌握变量的作用域和存储方式。掌握用掌握用#define定义无参数宏和带有参数宏定义和调用方法;定义无参数宏和带有参数宏定义和调用方法;掌掌握握#include文文件件包包含含的的使使用用方方法法,理理解解多多个个源源文文件件的的C程程 序序的运行的运行;了解条件编译的使用。了解条件编译的使用。第七章 函数及变量存储类别
2、 2第第七七章章 函数及变量存储类别函数及变量存储类别 v本章重点本章重点函数的定义与调用函数的定义与调用参数传递参数传递变量的作用域和存储方式变量的作用域和存储方式带参宏定义和使用方法、文件包含的使用带参宏定义和使用方法、文件包含的使用v本章难点本章难点参数传递参数传递变量的作用域和存储方式变量的作用域和存储方式带参宏定义和使用方法带参宏定义和使用方法 第七章 函数及变量存储类别 3函数的概念函数的概念 第七章 函数及变量存储类别 4函数的概念函数的概念 第七章 函数及变量存储类别 5函数的概念函数的概念 第七章 函数及变量存储类别 6函数的概念函数的概念 第七章 函数及变量存储类别 7函数
3、的概念函数的概念 第七章 函数及变量存储类别 8函数的概念函数的概念 第七章 函数及变量存储类别 9函数的定义和声明函数的定义和声明v函数的定义形式函数的定义形式 存储类型标识符存储类型标识符 类型标识符类型标识符 函数名函数名(类型名类型名 形式参数形式参数1,)说明部分说明部分 语句部分语句部分 函函数数定定义义由由函函数数首首部部和和函函数数体体两两部部分分组组成成。函函数数首首部部即即定定义义一一个个函函数数时时的的第第一一行行,包包括括存存储储类类型型标标识识符符、类类型型标标识识符符 函函数数名名和和由由()括括起起来来的的参参数数表表;部部分分称称为为函函数数体体,语法上是一个复
4、合语句。语法上是一个复合语句。第七章 函数及变量存储类别 101 1)存储类型标识符存储类型标识符说明函数的存储类型,它规定了函数可被调用说明函数的存储类型,它规定了函数可被调用的范围。可用于函数存储类型标识符有的范围。可用于函数存储类型标识符有staticstatic和和externextern,指定为指定为staticstatic的函数为静态函数,静态函数只能由和它在同一文件中定的函数为静态函数,静态函数只能由和它在同一文件中定义的函数调用;缺省或指定为义的函数调用;缺省或指定为externextern存储类型的函数为外部函数。存储类型的函数为外部函数。例如:例例如:例7.17.1中的中的
5、square()square()函数是外部函数。函数是外部函数。)类型标识符类型标识符说明函数返回值的数据类型,可以为任何基本类说明函数返回值的数据类型,可以为任何基本类型、结构体类型,还可以是指针类型,也可以是无返回值类型即型、结构体类型,还可以是指针类型,也可以是无返回值类型即空类型(空类型(voidvoid)。)。缺省时为缺省时为intint型。型。)函数名函数名是一个标识符,一程序中除是一个标识符,一程序中除main()main()外,其余函数的名外,其余函数的名字可以任意取。函数名一般不要超过个字符。同一文件中的函字可以任意取。函数名一般不要超过个字符。同一文件中的函数不能同名。数不
6、能同名。)形式参数形式参数可以是可以是0 0个、一个或多个,表示该函数被调用时所需个、一个或多个,表示该函数被调用时所需的一些必要信息的一些必要信息 函数定义的说明:函数定义的说明:第七章 函数及变量存储类别 11 函数定义的说明:函数定义的说明:)对于)对于有参函数有参函数,形式参数的定义与变量的定义,形式参数的定义与变量的定义形式相似形式相似)函数体函数体是一组放在一对花括号中的语句是一组放在一对花括号中的语句,一般一般包括声明部分和执行部分包括声明部分和执行部分)在函数中,形式参数可以作为已知的变量,不)在函数中,形式参数可以作为已知的变量,不需要对它赋值就可使用它,它的值是函数调用时由
7、需要对它赋值就可使用它,它的值是函数调用时由实参传递给形参变量而得到的实参传递给形参变量而得到的 第七章 函数及变量存储类别 12函数的定义和声明函数的定义和声明v函数返回值函数返回值C语言通过语言通过return语句获得函数返回值的,其格式如下:语句获得函数返回值的,其格式如下:return 表达式表达式;或或 return(表达式表达式);表达式的值就是函数的返回值。对于基本类型,表达式的类型和函数的表达式的值就是函数的返回值。对于基本类型,表达式的类型和函数的类型不相同时表达式的值自动转换为涵数的类型,对于指针,表达式的类型不相同时表达式的值自动转换为涵数的类型,对于指针,表达式的类型和
8、函数的类型不相同时,须使用类型强制符将表达式转换为函数的类型和函数的类型不相同时,须使用类型强制符将表达式转换为函数的类型;对于结构体,表达式值的类型与函数定义的类型必须相同。类型;对于结构体,表达式值的类型与函数定义的类型必须相同。例如,可以将例如,可以将power()函数定义为:函数定义为:double power(int x,int n)int i;long p;return(p);其中,其中,“return(p)”将表达式将表达式p的值作为的值作为power()函数的返回值。函数的返回值。p自动自动转换转换成成double类型。类型。第七章 函数及变量存储类别 13v函数的声明(函数的
9、声明(函数原型)函数原型)在使用自定义函数时,除了进行函数的定义外,还需要在调在使用自定义函数时,除了进行函数的定义外,还需要在调用该函数之前对其进行原型声明用该函数之前对其进行原型声明 函数原型声明和函数定义的区别函数原型声明和函数定义的区别函数原型声明的作用是将函数类型告诉编译系统,使程序在编译阶段函数原型声明的作用是将函数类型告诉编译系统,使程序在编译阶段对调用函数的合法性进行全面的检查,避免函数调用时出现参数的个对调用函数的合法性进行全面的检查,避免函数调用时出现参数的个数或类型不一致的运行错误。数或类型不一致的运行错误。函数定义部分则是函数的实际实现代码函数定义部分则是函数的实际实现
10、代码 函数原型声明的格式:函数原型声明的格式:存储类型标识符类型符存储类型标识符类型符 函数名函数名(形式参数表形式参数表);7.2 函数的定义和声明函数的定义和声明 第七章 函数及变量存储类别 14v7.2.3 函数的声明(函数原型)函数的声明(函数原型)说明:说明:(1)函函数数原原型型声声明明语语句句最最后后的的分分号号不不能能省省略略,其其作作用用是是表表示示该该语语句句是是进进行行函函数声明而不是函数定义。数声明而不是函数定义。(2)在原型声明中,形式参数名可以省略。)在原型声明中,形式参数名可以省略。如如:double power(int,int);和和 double power(
11、int x,int n);和和 double power(int a,int n);都都是是等等价价的的。power()函函数数是是double类类型型的的,它它有有两两个个int参参数数。声声明明给给出出的的参数名参数名x、n被编译忽略,因为参数的存储空间是在函数衩调用时进行的。被编译忽略,因为参数的存储空间是在函数衩调用时进行的。对于无参数表的函数,声明时参数表应指定为对于无参数表的函数,声明时参数表应指定为void。(3)如如果果被被调调用用函函数数的的定定义义出出现现在在调调用用函函数数之之前前,可可以以不不对对被被调调用用函函数数进进行原型声明。行原型声明。(4)如果)如果被调用函数
12、被调用函数已在所有函数定义之前进行了原型声明,则在各个调已在所有函数定义之前进行了原型声明,则在各个调用函数中不必再对该函数进行原型声明用函数中不必再对该函数进行原型声明()标准库函数的原型在系统提供的相应头文件中,因此,程序中调用标()标准库函数的原型在系统提供的相应头文件中,因此,程序中调用标准库函数时,只需用准库函数时,只需用#include预处理控制包含所需的头文件,而不需要写函预处理控制包含所需的头文件,而不需要写函数声明。数声明。函数的定义和声明函数的定义和声明 第七章 函数及变量存储类别 15v函数的声明(函数原型)函数的声明(函数原型)说明:说明:(1)函函数数原原型型声声明明
13、语语句句最最后后的的分分号号不不能能省省略略,其其作作用用是是表表示示该该语语句句是是进进行行函函数声明而不是函数定义。数声明而不是函数定义。(2)在原型声明中,形式参数名可以省略。)在原型声明中,形式参数名可以省略。如如:double power(int,int);和和 double power(int x,int n);和和 double power(int a,int n);都都是是等等价价的的。power()函函数数是是double类类型型的的,它它有有两两个个int参参数数。声声明明给给出出的的参数名参数名x、n被编译忽略,因为参数的存储空间是在函数衩调用时进行的。被编译忽略,因为参
14、数的存储空间是在函数衩调用时进行的。对于无参数表的函数,声明时参数表应指定为对于无参数表的函数,声明时参数表应指定为void。(3)如如果果被被调调用用函函数数的的定定义义出出现现在在调调用用函函数数之之前前,可可以以不不对对被被调调用用函函数数进进行原型声明。行原型声明。(4)如果)如果被调用函数被调用函数已在所有函数定义之前进行了原型声明,则在各个调已在所有函数定义之前进行了原型声明,则在各个调用函数中不必再对该函数进行原型声明用函数中不必再对该函数进行原型声明()标准库函数的原型在系统提供的相应头文件中,因此,程序中调用标()标准库函数的原型在系统提供的相应头文件中,因此,程序中调用标准
15、库函数时,只需用准库函数时,只需用#include预处理控制包含所需的头文件,而不需要写函预处理控制包含所需的头文件,而不需要写函数声明。数声明。函数的定义和声明函数的定义和声明 第七章 函数及变量存储类别 16函数的说明函数的说明v函数说明的形式函数说明的形式 函数返回值的类型名函数返回值的类型名 函数名函数名(类型名类型名 形式参数名形式参数名1,类型名形参数名,类型名形参数名);简单地说就是在函数的首部加上一个简单地说就是在函数的首部加上一个“;”。因为函数的声明是语句,因此后面的。因为函数的声明是语句,因此后面的“;”必不可少。必不可少。double area(double a,dou
16、ble b);/*函数声明函数声明*/main()double x=1.2,y=2.4,z;z=area(x,y);/*函数调用函数调用*/printf(“area=%lf”,z);double area(double a,double b)/*函数定义函数定义*/double s;s=a*b;return s;第七章 函数及变量存储类别 17函数的说明函数的说明v 函数说明的形式函数说明的形式 函数在说明时的形参名可以和定义时的形参名不同函数在说明时的形参名可以和定义时的形参名不同函数返回值的类型名函数返回值的类型名 函数名函数名(类型名类型名 参数名参数名1,类型名,类型名 参数名参数名2
17、);如上例中就完全可以把函数声明为如上例中就完全可以把函数声明为double area(double m,double n);/*函数声明函数声明*/main()double x=1.2,y=2.4,z;z=area(x,y);/*函数调用函数调用*/printf(“area=%lf”,z);double area(double a,double b)/*函数定义函数定义*/double s;s=a*b;return s;第七章 函数及变量存储类别 18函数的说明函数的说明v函数说明的形式函数说明的形式 函数在说明时甚至可以省略不写形参名,只有类型名函数在说明时甚至可以省略不写形参名,只有类型
18、名函数返回值的类型名函数返回值的类型名 函数名函数名(类型名类型名,类型名,类型名);如上例中就完全可以把函数声明为如上例中就完全可以把函数声明为double area(double,double);/*函数声明函数声明*/main()double x=1.2,y=2.4,z;z=area(x,y);/*函数调用函数调用*/printf(“area=%lf”,z);double area(double a,double b)/*函数定义函数定义*/double s;s=a*b;return s;第七章 函数及变量存储类别 19函数的说明函数的说明v函数说明的形式函数说明的形式 函数在说明也可以
19、与普通变量一起出现在同一个类型定义语句中,函数在说明也可以与普通变量一起出现在同一个类型定义语句中,类型名变量名类型名变量名1,变量名,变量名2,函数名函数名(类型名类型名,类型名,类型名);如上例中就完全可以把函数声明为如上例中就完全可以把函数声明为 main()double x=1.2,y=2.4,z,area(double,double);/*变量定义、函数声明变量定义、函数声明*/z=area(x,y);/*函数调用函数调用*/printf(“area=%lf”,z);double area(double a,double b)/*函数定义函数定义*/double s;s=a*b;re
20、turn s;第七章 函数及变量存储类别 20函数的定义与调用函数的定义与调用 第七章 函数及变量存储类别 21函数的定义与调用函数的定义与调用 第七章 函数及变量存储类别 22函数的参数函数的参数 第七章 函数及变量存储类别 23函数的参数函数的参数 第七章 函数及变量存储类别 24函数的参数传递函数的参数传递数据只能从实参单向传到形参,即实参的值不能通过函数改数据只能从实参单向传到形参,即实参的值不能通过函数改变。变。到目前为止,函数最多只能返回一个函数值。到目前为止,函数最多只能返回一个函数值。第七章 函数及变量存储类别 25void swap(int x,int y)int t;t=x
21、;x=y;y=t;printf(%d%d ,x,y);main()int a=3,b=4;swap(a,b);printf(%d%d ,a,b);程序输出结果:程序输出结果:4 3 3 4形式参数(形参)形式参数(形参)实际参数(实参)实际参数(实参)实际参数(实参)实际参数(实参)单向值传递单向值传递函数的参数传递函数的参数传递【例例】以下程序的输出结果是以下程序的输出结果是 第七章 函数及变量存储类别 26v例:形参与实参的数值传递。例:形参与实参的数值传递。程序代码如下:程序代码如下:#includevoid swap(int a,int b);/*声明函数原型声明函数原型*/void
22、main()int x,y;x=10;y=20;printf(Before swapping:x=%d y=%dn,x,y);swap(x,y);/*调用函数调用函数*/printf(After swapping:x=%d y=%dn,x,y);void swap(int a,int b)/*定义函数定义函数*/int t;t=a;a=b;b=t;形形参和实参的数值传递参和实参的数值传递 第七章 函数及变量存储类别 27v程序输出如下:程序输出如下:Before swapping:x=10 y=20After swapping:x=10 y=20 形形参和实参的数值传递参和实参的数值传递 第七
23、章 函数及变量存储类别 28s(int r)return 3.14*r*r;main()int r,area;scanf(%d,&r);printf(%dn,s(r);自动转换自动转换自动转换自动转换为为为为intintintint型型型型 思考:思考:若要得到单精度实型的圆面积,程序应如何修改若要得到单精度实型的圆面积,程序应如何修改程序运行情况如下:程序运行情况如下:2 12例例 参数的返回值参数的返回值 第七章 函数及变量存储类别 29 第七章 函数及变量存储类别 30 第七章 函数及变量存储类别 31 第七章 函数及变量存储类别 327.4 指针与函数指针与函数 第七章 函数及变量存储
24、类别 33 第七章 函数及变量存储类别 34 第七章 函数及变量存储类别 35例函数的嵌套例函数的嵌套调用调用main()int n=3;printf(%dn,sub1(n);sub1(int n)sub1(int n)intint i,a=0;i,a=0;for(i=n;i0;i-)for(i=n;i0;i-)a+=a+=sub2(i);sub2(i);return a;return a;sub2(int n)sub2(int n)return n+1;return n+1;程序输出结果:程序输出结果:9 第七章 函数及变量存储类别 36 第七章 函数及变量存储类别 37递归调用过程递归调用
25、过程 递递 推推main()fact(4)fact(3)fact(2)fact(1)y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;return 24 return 6 return 2 return 1 回回 推推 第七章 函数及变量存储类别 38例例 用递归方法求用递归方法求Fibonacci数列。数列。#include double fib(int n)if(n=1|n=2)return 1;return fib(n-1)+fib(n-2);void main()int n;printf(“n=”);scanf(“%d,&n);prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 11 25

限制150内