c语言第6章 函数

上传人:油条 文档编号:48812350 上传时间:2018-07-20 格式:PPT 页数:43 大小:245.50KB
返回 下载 相关 举报
c语言第6章 函数_第1页
第1页 / 共43页
c语言第6章 函数_第2页
第2页 / 共43页
c语言第6章 函数_第3页
第3页 / 共43页
c语言第6章 函数_第4页
第4页 / 共43页
c语言第6章 函数_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《c语言第6章 函数》由会员分享,可在线阅读,更多相关《c语言第6章 函数(43页珍藏版)》请在金锄头文库上搜索。

1、计算机基础教学实验中心1第六章第六章 函数函数1计算机基础教学实验中心 主要内容参数传递2函数的定义1函数的调用4函数的返回值3变量的作用域5内部函数与外部函数7变量的存储类别62计算机基础教学实验中心6.1 函数的定义 无参函数通常用来执行一些功能比较固定单一的语句。例如:getchar( )从形式上来说,函数分为两类: 有参函数通常通过处理传递过来的参数,将函数值返回给调用处。 如:sqrt(4)、pow(2,3)、strlen(“hello”);3计算机基础教学实验中心有参函数的定义形式:6.1 函数的定义例:float max( float a , float b )return (a

2、b)?a:b;类型标示符 函数名(形式参数列表) 函数体; 函数头4计算机基础教学实验中心6.1 函数的定义例:void print_star( )printf(“*”);类型名 函数名() 函数体; 在定义函数时,也可以不指定形式参数列表,这样的 函数就是无参数函数。其定义形式如下:5计算机基础教学实验中心注意:函数的定义在程序中都是平行的,即不允许在一个 函数的内部再定义另一个函数;函数名是用户自定义标识符,当函数值为整型时类 型名可省略(不推荐省略);当函数不需要向调用处返 回值时,使用void类型名形参表中的形参是用户自定义标识符,没有参数时 ,圆括号不能省略,此时函数为无参函数。6.

3、1 函数的定义6计算机基础教学实验中心main( ) float x= max(3,4); 6.2 参数传递float max(float a,float b) return (ab)?a:b; 调用max时给出了实际参数。 定义max时使用了形式参数。实际参数、形式参数调用函数被调函数通过参数传递传入值通过return返回值注意:参数传递是单向值传递。7计算机基础教学实验中心注意:(1)实参向形参的数据传递是单向的“值传递”。 实参和形参在内存中被分配到不同的单元,发生函 数调用时,只是将实参的“值“传给形参,在函数 中即使改变了形参的值也不会影响实参原来的值(2)实参和形参的顺序应该一致且

4、个数相等。 在调用函数时,如果实参顺序与函数定义的形参顺序 不一致,形参可能无法接收到正确的值;如果实参 与形参个数不一致,编译器会报错(3)实参和形参的数据类型应尽量保持一致。6.2 参数传递8计算机基础教学实验中心6.2.3 数组作参数(1)把数组的元素作实参int a=1,2,3 fun1(a2)(2)把数组名作实参int a=1,2,3fun2(a)9计算机基础教学实验中心此时与普通变量作为实参进行参数传递 没有区别,此时发生单向值传递。6.2.3 数组元素作函数实参例如:int a5=0,1,2,3,4;double y=sqrt(a2);int x=abs(a3);int z=ma

5、x(a1,a3)10计算机基础教学实验中心例:计算5个学生成绩的平均分,学生成绩已在数组中存放。6.2.3 数组名作函数实参当用数组名作为函数实参时,函数形参会接收到此 数组的首地址。这就意味着函数形参数组首地址等 于实参数组首地址。 在函数中对形参数组的操作直接作用于实参数组。void main() int a3=4,5,6;f(a);/数组名作实参 void f(int b3) b0=8;b1=9;b2=10; 11计算机基础教学实验中心void main() float s5=80,82,70,90,68;float a1=f1(s0,s1,s2,s3,s4);/数组元素作实参float

6、 a2=f2(s,5); /数组名(数组首地址)作实参 float a1(float a,float b,float c,float d,float e) return (a+b+c+d+e)/5; float a2(float score,int n) float result=0;int i;for (i=0;iy?x:y; int main( ) float x=0.5,y=0.3,z;z=max(x,y);printf(“max=%f”,z);return 0; return语句返回float类型, 而max函数被定义为int类型, 返回值类型被强制转换为int 14计算机基础教学实验

7、中心6.4 函数的调用下列几种调用形式都是正确的: 函数以表达式语句的形式出现。如:print_line( ); 函数出现在表达式中。v2=max(x,y)*10; 函数作其它函数的实参。num=max(max(max(a,b),c),d);15计算机基础教学实验中心6.4.2 函数原型的提前声明float max(float a,float b) return (ab)?a:b; void main() max(3.1,5.6); 之前已经有 了函数定义函数和变量一样,也必须“先定义,后使用”。 下面定义的max函数就放在了主函数中调用语句之前,所以 主函数可以直接调用max。16计算机基础

8、教学实验中心6.4.2 函数原型的提前声明int main() float a, b;scanf(“%f %f”, printf(“%f”, avg(a, b);/调用后面定义的avg函数return 0; float avg(float x, float y) return (x+y)/2; 要调用在后面定义的函数,必须在调用函数之前提前声明此 函数的原型,否则无法识别函数。原型可不写出形参名。原型可不写出形参名。float avg(float,float);/提前说明后面有avg这个函数17计算机基础教学实验中心6.4.3 函数的嵌套调用在一个函数定义的内部调用另外的函数。C语言中所有函数

9、的定义都是平行的,也就是说, 不能在函数定义中再定义其它函数。 C语言允许在定义函数时调用其它函数,比如说函 数a调用函数b,而函数b又调用函数c,这就是函数的嵌 套调用。18计算机基础教学实验中心6.4.3 函数的嵌套调用int square(int a) return a*a; int pythagoras(int a,int b) return sqrt(square(a)+square(b); void main() int x=pythagoras(3,4); 19计算机基础教学实验中心C语言允许函数在定义中直接或间接地调用自己, 即函数的递归调用。f( ) .f( );.间接调用指

10、在f1函数中调用了f2 函数,但在f2函数中又调用了f1 函数。f1( ) .f2( );.f2( ) .f1( );.直接调用指在被 调函数中直接调 用本函数。6.4.3 函数的递归调用20计算机基础教学实验中心long factorial(int n) if(n1) return n*factorial(n-1); /*递归调用计算n!*/ else return 1; 下面是一个直接调用的例子,求 n!6.4.3 函数的递归调用21计算机基础教学实验中心int factorial(int n) if(n1) return n*factorial(n-1); else return 1;

11、f(5)f(1)f(3)f(4)f(2)f(2)f(3)f(4)f(5)=1=2*f(1)=2=3*f(2)=6=4*f(3)=24=5*f(4)=120 n为5时:factorial(int n) int i,fact=1;for(i=1;i 25计算机基础教学实验中心6.4 函数的调用 实参表达式求值的顺序是不确定的。如(求3的2次方):n=3; pow(n,n-);23223332n=3; pow(n,n-1);n=3; pow(n,-n);3226计算机基础教学实验中心void fun(int x) int y;if (x0)int x; 6.5.1 程序块成对的大括号及内部的语句组成

12、了程序块。函数体、选择和 循环结构中都要用大括号表示边界。大括号内定义的变量,必须紧跟在左大括号后面,其作用范 围是从定义处直到配对的右大括号之前。若多层大括号中出 现重名变量,外层同名变量在内层中被屏蔽不起作用。z作用域x作用域y作用域27计算机基础教学实验中心main()int i,j;i=1; j=5;printf(“%d,%dn“,i,j);int i=8;i+; j+;printf(“%d,%dn“,i,j);i+; j+;printf(“%d,%dn“,i,j);运行结果: 1,5 9,6 2,7 28计算机基础教学实验中心变量可以在程序中三个地方说明:函数的参数定义部分 形式参数

13、函数内部 局部变量函数外部 全局变量(即大括号外的变量)6.5.2 局部变量 6.5.3 全局变量29计算机基础教学实验中心6.5.2 局部变量 在函数内定义的变量,其作用范围局限于此函数体内部 ,这种变量叫局部变量,函数的形参、在main函数中定 义的变量也是局部变量。 局部变量在函数被调用时由系统分配存储区,在不同的 函数中同名的变量实际上在内存中占不同的单元,因此 在不同的函数中可以定义相同名字的局部变量。30计算机基础教学实验中心 #include “stdio.h” void fun(int x, int y) int z=10;x+=10; y+=10;if(z)int z=20;

14、printf(“x=%d y=%d z=%dn”, x, y, z);printf(“x=%d y=%d z=%dn”, x, y, z); int main() int x=10, y=10, z=10;fun(x, y);printf(“x=%d y=%d z=%d”, x, y, z);return 0; 程序的运行结果是: x=20 y=20 z=20 x=20 y=20 z=10 x=10 y=10 z=1031计算机基础教学实验中心6.5.3 全局变量 在任何大括号外面定义的变量叫全局变量,其作用范围 是从定义处直到文件末尾。 由于全局变量作用范围很大,若在某个函数中修改了全 局变

15、量的值,在其它函数中读出的就是这个新值。建议:用大写字母命名全局变量,便于区分局部变量。32计算机基础教学实验中心#include “stdio.h” int x,y; void fun() int a=20, b=10;x=x+a+b;/x=8+20+10y=y+a-b;/y=2+20-10 int main() int a=5, b=3;x=a+b; /x=8y=a-b;/y=2fun();printf(“%d, %d”, x, y);/x=38, y=12return 0; 33计算机基础教学实验中心标准C语言支持四种变量存储类型。说明符如下: auto、static、extern、register。 6.6 变量的存储类型34计算机基础教学实验中心6.6.1 自动变量自动变量必须在函数中定义。当函数被调用,系统 会自动创建自动变量并分配存储空间,当函数调用结 束时系统会自动销毁自动变量并释放存储空间。 如:auto int i;auto可以省去不写如: int i;/等价于auto int ichar c;/等价于auto char cfloat f;/等价于auto float f35计算机基础教学实验中心6.6.2 静态变量在函数中定义的static变量与auto变量的区别: 在函数调用结束

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号