吴宏瑜全套配套课件c语言程序设计第5章函数

上传人:E**** 文档编号:100544988 上传时间:2019-09-24 格式:PPTX 页数:37 大小:4.29MB
返回 下载 相关 举报
吴宏瑜全套配套课件c语言程序设计第5章函数_第1页
第1页 / 共37页
吴宏瑜全套配套课件c语言程序设计第5章函数_第2页
第2页 / 共37页
吴宏瑜全套配套课件c语言程序设计第5章函数_第3页
第3页 / 共37页
吴宏瑜全套配套课件c语言程序设计第5章函数_第4页
第4页 / 共37页
吴宏瑜全套配套课件c语言程序设计第5章函数_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《吴宏瑜全套配套课件c语言程序设计第5章函数》由会员分享,可在线阅读,更多相关《吴宏瑜全套配套课件c语言程序设计第5章函数(37页珍藏版)》请在金锄头文库上搜索。

1、1,第五章 函数,5.1 函数的概述,C语言是由函数构成的 主函数 main 在程序中可以使用标准库函数 数学函数 sqrt, abs, sin, floor, ceil, . 输入输出函数 putchar,getchar,printf,scanf, 在程序中可以自定义函数,5.2 函数的定义,5.2.1 无参数函数的定义 定义函数时不指定形式参数列表,这样的函数就是无参数函数。 类型标识符 函数名() 函数头 语句块 函数体 ,5.2 函数的定义,5.2.2 有参数函数的定义 定义函数时需要指定形式参数列表,这样的函数就是有参函数。 类型标识符 函数名(形式参数列表) 函数头 语句块 函数体

2、 ,函数名,函数体,形参列表,函数类型,函数体,形参列表,定义函数的形参变量应该注意以下几点,函数形式参数列表中的变量名不允许重复,每个变量必须单独定义 函数体内定义的变量名不能与形式参数列表中的变量重名 函数体内的变量定义语句必须写在函数体的开始部分 如果在定义函数时不写出函数类型标识符,编译器会自动指定该函数类型为int型。,5.3 函数间数据传递,5.3.1 实际参数和形式参数 定义函数时,函数头的形式参数列表中的那些参数叫形式参数,简称形参 调用函数时,在函数名后面的括号内填写的数据值是实际参数,简称实参,形式参数,程序的运行结果是: 20,实际参数,在定义函数和调用函数时,应注意以下

3、几点 1/3,实参向形参的数据传递是单向的“值传递” 实参和形参在内存中被分配到不同的单元,发生函数调用时,只是将实参的“值”传给形参,在函数中即使改变了形参的值,也不会影响实参的值。,在定义函数和调用函数时,应注意以下几点 2/3,实参和形参应该顺序一致,个数相等 在调用函数时,如果实参顺序与函数定义的形参顺序不一致,形参将无法接收到正确的值;如果实参与形参个数不一致,编译时会报语法错误。,在定义函数和调用函数时,应注意以下几点 3/3,实参和形参的数据类型应保持一致 在函数调用时,如果实参和形参数据类型不一致,将发生隐式转换,此时将实参的值向形参的数据类型转换。如果实参的数据类型精度高于形

4、参,在隐式转换时可能发生数据精度丢失,造成程序运行结果误差。,5.3.2 数组作为参数,1数组元素作为函数的参数 数组的每个元素相当于一个变量,因此将数组元素作为实参,和将变量作为实参情况一样,这种参数传递也是单向值传递。,此程序中,a数组各个元素的值被分别作为实参传递给add函数的形参变量a,b,c。在add函数中对形参a,b,c的处理跟a数组无关。,5.3.2 数组作为参数,2数组名作为函数的参数 数组名表示数组的首地址,将数组名作为实参意味着把数组的首地址传递给函数,于是在函数中就能对外部的数组读写。,此程序中,实参数组x的地址传递给形参数组a,于是a数组和x数组地址相同。在sum函数中

5、对a数组的读写即相当于对main函数中x数组的读写。,5.4函数的返回值,5.4.1 无返回值的函数 若函数调用不需要返回值,可以在定义函数时指定函数类型为void 请注意: 不要在void类型的函数中返回一个值。 在调用void类型的函数时,不能将函数放在表达式中,因为void型值不能用于表达式。,5.4函数的返回值,5.4.2 有返回值的函数 函数在执行结束时,可以用return语句将一个数据返回到调用处。在定义有返回值的函数时,函数值的类型将决定返回值的类型。return语句只能返回一个数据值。,函数类型为int,而return语句表达式值为double,函数值会自动转换为int类型,函

6、数类型为double,与return语句表达式值类型一致,5.5 函数的调用,5.5.1 函数的调用 在C语言中调用函数时,可以有以下几种方式 (1)函数单独成为一条语句。 (2)函数出现在表达式中。 y=sqrt(x); /函数调用出现在赋值语句中 z=max(x,y)/100; /函数调用出现在表达式中 (3)函数出现在函数中作为实参。 n=max(max(max(a,b),c),d);,5.5 函数的调用,5.5.2 函数的原型声明 在调用函数的语句之前,必须出现函数的定义或者原型声明。 原型声明其实就是函数定义的第一行,即函数头。,此程序中,f1函数的定义位于函数调用语句之后,在前面提

7、前声明函数原型即可。,函数的原型声明中,可以省略形参变量名,但函数定义处的形参变量名必须写出,例如:,5.5 函数的调用,5.5.3 函数的嵌套调用 函数定义之间是相互平行的,在函数内部可以调用其它函数,称为嵌套调用。在调用函数时,主调函数暂停执行,转而执行被调函数,当被调函数执行完后,返回到主调函数继续执行。,void f1() f2(); ,void f2() f3(); ,void f3() ,5.5 函数的调用,5.5.4 函数的递归调用 函数对自身的直接或间接调用,称为递归调用。,void f1() f2(); ,void f2() f1(); ,void f1() f1(); ,例

8、5.17用递归求阶乘,递归的调用和返回过程: (1)调用f(5)函数将返回5*f(4),此时必须等待f(4)函数返回,接下来调用f(4)。 (2)调用f(4)函数将返回4*f(3),此时必须等待f(3)函数返回,接下来调用f(3); (3)调用f(3)函数将返回3*f(2),此时必须等待f(2)函数返回,接下来调用f(2); (4)调用f(2)函数将返回2*f(1),此时必须等待f(1)函数返回,接下来调用f(1); (5)调用f(1)函数将返回数值1,此时递归已到达最大深度,不会再发生递归调用,接下来将逐步返回。 (6)f(2)将返回2*1 f(3)将返回3*2 f(4)将返回4*6 f(5

9、)将返回5*24,5.5 函数的调用,5.5.5 函数的定义、调用以及函数声明的比较 函数的定义指函数的实现过程 函数的调用指在程序中执行函数的过程。 如果函数的调用之前未见到函数定义,则必须使用函数声明语句将位于别处定义的函数作用范围扩展到声明处。,5.6 变量的作用域,位于大括号中定义的变量,其作用范围限于大括号内 在程序中有时会出现大括号的嵌套,外层大括号内的变量在内层大括号中也是可见的,而内层大括号的变量作用范围不可向外层扩展 若内层和外层大括号的变量重名,内层大括号中的变量将屏蔽外层大括号的同名变量,5.6 变量的作用域,5.6.1 局部变量 在函数内定义的变量,其作用作用域位于函数

10、体,这种变量称为局部变量。 在不同的函数中,同名的变量实际上在内存中占不同的单元,因此,不同的函数中可以定义相同名字的局部变量。,程序的运行结果是: x=20 y=20 z=20 x=20 y=20 z=10 x=10 y=10 z=10,5.6 变量的作用域,5.6.2 全局变量 在任何函数外定义的变量,即在所有大扩号之外定义的变量,称为全局变量。 全局变量在函数间提供了数据共享,文件中所有函数都能读写同一全局变量的值,在一个函数中修改了全局变量值,在其它函数中都能读出这个新值。 在C语言中使用全局变量需要注意: (1)全局变量在程序运行时会一直占据存储单元,尽量少定义全局变量。 (2)当局

11、部变量与全局变量重名时,全局变量在局部变量的作用范围内被屏蔽。,程序的运行结果是: 38 12,5.7 变量的存储类别,变量存储类别及所在存储区,5.7 变量的存储类别,5.7.1 自动变量 自动变量由auto关键字说明,语句块或函数内定义的局部变量就是自动变量。c语言局部变量默认为auto类别,所以可以忽略不写。 当语句块或函数被执行时,系统会自动创建局部变量并为其分配内存空间,当语句块或函数执行结束时,系统会自动销毁局部变量并回收内存空间。,max函数内的局部c变量是自动变量,当max函数被调用时,系统会自动创建局部变量c,当max函数调用结束时,系统会自动销毁c变量。,5.7 变量的存储

12、类别,5.7.2 静态变量 静态变量由static关键字说明,静态变量在整个程序运行时都一直存在,不像自动变量会因函数是否调用而被创建或销毁。 尽管静态变量一直存在,也仅限在其所在函数内访问。,静态变量c在程序开始运行时就立即创建并且初值为3。主函数每次调用fun函数时,都会重新创建自动变量a和b,而c变量不随fun函数调用而创建,也不因fun函数调用结束而销毁。因此,多次调用fun函数时c变量始终从上一次的值递增。,程序的运行结果是: 7 8 9,5.7 变量的存储类别,5.7.3 寄存器变量 寄存器变量由register关键字说明,其目的是告知编译器将变量存储在寄存器中,这样可以提高变量的

13、读写速度。 使用寄存器变量需要注意以下几点: (1)只有局部变量或函数的形参变量才能被声明为寄存器变量。 (2)寄存器变量的地址不可访问,不能对寄存器变量取地址。 (3)编译器会按照自身的优化规则,自动将变量存储在寄存器中。,5.7 变量的存储类别,5.7.4 外部变量 外部变量由extern关键字说明,用于扩展现有全局变量的作用域。 全局变量的作用域可以被extern扩展到本文件中的任意位置,还可以扩展到其他文件中,从而实现多文件共享全局变量。,5.7 变量的存储类别,5.7.5内部函数和外部函数 声明为static类型的函数称为内部函数(又称静态函数),仅允许在定义函数的文件内调用此函数。

14、 声明为extern类型的函数称为外部函数,允许在其他文件中调用此函数。,不允许扩展到其它文件,允许扩展到其它文件,允许扩展到其它文件,本章小结,函数的定义和返回值,任何函数(包括主函数)都是由函数说明和函数体两部分组成。根据函数是否需要参数,可将函数分为无参函数和有参函数两种。 所有函数(包括主函数)都是平行的。一个函数的定义,可以放在程序中的任意位置,主函数main()之前或之后。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。 有参函数的返回值,是通过函数中的return语句来获得的。调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void”定义将函数成“无(空)类型”。 函数的调用切记:实参的个数、类型和顺序,应该与被调用函数所要求的参数个数、类型和顺序一致,才能正确地进行数据传递。函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。 值传递:当形参是普通变量,对应的实参可以是普通变量、常量、表达式。 地址传递:当形参是指针或数组时,对应的实参可以是普通变量的地址、数组名、实参。,本章结束,37,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

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