c程序设计教学课件作者杨远第8章函数

上传人:E**** 文档编号:102540692 上传时间:2019-10-03 格式:PPT 页数:28 大小:83.50KB
返回 下载 相关 举报
c程序设计教学课件作者杨远第8章函数_第1页
第1页 / 共28页
c程序设计教学课件作者杨远第8章函数_第2页
第2页 / 共28页
c程序设计教学课件作者杨远第8章函数_第3页
第3页 / 共28页
c程序设计教学课件作者杨远第8章函数_第4页
第4页 / 共28页
c程序设计教学课件作者杨远第8章函数_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《c程序设计教学课件作者杨远第8章函数》由会员分享,可在线阅读,更多相关《c程序设计教学课件作者杨远第8章函数(28页珍藏版)》请在金锄头文库上搜索。

1、第8章 函数,8.1 C函数概述 8.2 函数定义的一般形式 8.3 函数的参数和函数的值 8.4 函数的调用 8.5 函数的嵌套调用 8.6 函数的递归调用,第8章 函数,8.7 函数的指针和指向函数的指针变量 8.8 返回指针值的函数 8.9 局部变量和全局变量 8.10 函数间的数据传递 8.11 有参主函数和有参宏 8.12 变量的存储类型,8.1 C函数概述,在前面己经介绍过,C语言源程序是由函数组成的。虽然在前面各章的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C语言源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其他高级语言

2、的子程序。 在C语言中可从不同的角度对函数进行分类。 从函数定义的角度看,函数可分为库函数和用户定义函数两种。,返回,下一页,8.1 C函数概述,C语言的函数兼有其他语言中的函数和过程两种功能。从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。 从主调函数和被调函数之间数据传送的角度看函数又可分为无参函数和有参函数两种。 C语言提供了极为丰富的库函数,这些库函数又可从功能的角度可以分为多种分类。,返回,上一页,8.2 函数定义的一般形式,8.2.1无参函数的定义形式 无参函数的定义形式如下: 类型标识符 函数名() 声明部分 语句 其中类型标识符(类型说明符)和函数名称为函数头。类型

3、标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该类型标识符与前面介绍的各种说明符相同。,返回,下一页,8.2 函数定义的一般形式,中的内容称为函数体。在函数体中的声明部分,是对函数体内部所用到的变量、数组、函数等的说明。 在很多情况下都不要求无参函数有返回值,此时函数的类型标识符可以写为void 8.2.2有参函数定义的一般形式 参函数的定义形式如下:,返回,下一页,上一页,8.2 函数定义的一般形式,类型标识符 函数名(形式参数表列) 声明部分 语句 有参函数比无参函数多了一个内容,即形式参数表列。,返回,上一页,8.3 函数的参数和函数的值,8.3.1形式参数和实际参数 函

4、数的形参和实参具有以下特点。 (1)形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 (2)形参可以是变量或数组 (3)实参和形参在数量、类型、川页序上应严格一致,否则会出现类型不匹配的错误。 (4)函数调用中形参与实参间的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。,返回,下一页,8.3 函数的参数和函数的值,8.3.2函数的返回值 函数的值是指函数被调用时,执行函数体中的程序段所取得的并返回给主调函数的值。 (1)函数的值只能通过return语句返回主调函数。 (2)函数值的类型和return语句中表达式值的类型应保持一致。 (

5、3)如函数值为整型,在函数定义时可以省去类型说明。 (4)不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。,返回,上一页,8.4 函数的调用,8.4.1函数调用的一般形式 前面已经说过,在程序中是通过对函数的调用来执行函数体的,其过程与其他语言的子程序调用相似。 C语言中,函数调用的一般形式为: 函数名(实际参数表) 8.4.2函数调用的方式 在C语言中,可以用以下几种方式调用函数。,返回,下一页,8.4 函数的调用,(1)函数表达式 (2)函数语句 (3)函数实参 8.4.3被调用函数的声明 在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要

6、先进行变量说明是一样的。在主调函数中对被调函数作说明的日的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。,返回,下一页,上一页,8.4 函数的调用,其一般形式为: 类型说明符被调函数名(类型形参,类型形参); 或为: 类型说明符被调函数名(类型,类型); 括号内给出了形参的类型和形参名,或只给出形参类型,这便于编译系统进行检错,以防止可能出现的错误。 C语言中又规定在以下几种情况时可以省去在主调函数中对被调函数的说明。 (1)如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。,返回,下一页,上一页,8.4 函数的调用,(2)当被调

7、函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。 (3)如在所有函数的定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明 (4)对库函数的调用不需要再作说明,但必须把该函数的头文件用#include命令包含在源程序前部。,返回,上一页,8.5 函数的嵌套调用,C语言中不允许作嵌套的函数定义,因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用,这样就出现了函数的嵌套调用,即在被调函数中又调用其他函数,这与其他语言的子程序嵌套的情形是类似的,返回,8.6 函

8、数的递归调用,一个函数调用它自身称为递归调用,这种函数称为递归函数。递归分直接递归和间接递归。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。 为了防止递归调用尤终止地进行,必须在函数内有终止递归调用的手段。,常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。,返回,8.7 函数的指针和指向函数的 指针变量,在C语言中,一个函数总是占用一段连续的内存区,函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入日地址)赋予一个指针变量,使该指针变量指向该函数。这样通过指针变量就可以找到并调用这

9、个函数了。我们把这种指向函数的指针变量称为“函数指针变量”。 函数指针变量定义的一般形式为: 类型说明符(*指针变量名) 其中“类型说明符”表示被指函数的返回值的类型,返回,8.8 返回指针值的函数,在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。 定义指针型函数的一般形式为: 类型说明符*函数名(形参表) /*函数体*/ 其中函数名之前加了“,”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表小了返回的指针值指向的数据的类型。,返回,8.9 局部变量和全局变量,8.9.1局部变量 局部变量也称为内部变量。局部变量是在函数内定义的,其作用域仅限

10、于函数内,离开该函数后再使用这种变量是非法的。 关于局部变量的作用域还要说明以下几点 (1)主函数中定义的变量只能在主函数中使用,不能在其他函数中使用,主函数中也不能使用其他函数中定义的变量。 (2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。,返回,下一页,8.9 局部变量和全局变量,(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不十扰,也不会发生混淆。 (4)在复合语句中也可定义变量,其作用域只在该复合语句范围内。 8.9.2全局变量 全局变量也称为外部变量,它是在函数外部定义的变量,它不属于哪一个函数,其作用域是从定义位置至整个源

11、程序结束。在作用域外的函数中使用全局变量,应作全局变量说明说明符为extern,返回,上一页,8.10 函数间的数据传递,返回值方式是通过函数调用后直接返回一个值到主调函数中的,是从被调函数向主调函数传递数据。 8.10.2全局变量方式 全局变量方式是利用在主调函数和被调函数中均有效的全局变量,在主调函数和被调函数之间任意传递数据。 8.10.3参数方式 参数方式是在形参和实参之间传递数据,是从主调函数向被调函数传递,即由实参传递给形参,而且传递的数据可以是值也可以是地址,即可分为值传递和地址传递。,返回,下一页,8.10 函数间的数据传递,1.值传递 值传递时,形参只能是变量(不包含指针变量

12、),相应的实参可以是非地址型的常量、变量、表达式。 2.地址传递 地址传递时,形参只能是指针变量或数组名,相应的实参可以是变量的地址、指针变量、数组名、函数名。注意,由于传递给形参的是地址,而使相应的形参和实参具有相同的地址,则形参所指向的对象改变,相应实参所指向的对象将随之改变。,返回,上一页,8.11 有参主函数和有参宏,8.11.1有参主函数 前面介绍的main函数都是不带参数的,因此main后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上把这两个参数写为aigc和aigv。 C语言还规定argc

13、(第一个形参)必须是整型变量,argv(第一个形参)必须是字符型指针数组。 实际上,main函数的参数值是从操作系统命令行上获得的。当要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数可把这些实参传送到main函数的形参中去。,返回,下一页,8.11 有参主函数和有参宏,但是应该特别注意的是,main函数的两个形参和命令行中的参数在位置上不是一一对应的。因为,main的形参只有两个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。 8.11.2有参宏 符号常量PI是

14、用编译预处理的宏命令定义的: #define P工3 .14 PI也称为宏名。实际上,宏还可以有参数,其定义的一般形式为: #define宏名(参数表)字符串,返回,上一页,8.12 变量的存储类型,8.12.1动态存储方式与静态存储方式 C语言中的变量从作用域(即从空间)角度,可以分为全局变量和局部变量;而从变量值存在的时间(即生存期)角度,又可以分为静态存储方式和动态存储方式。 静态存储方式是指在程序运行期间分配固定存储空间的方式。 动态存储方式是在程序运行期间根据击要进行动态分配存储空间的方式。 用户存储空间可以分为以下3个部分: (1)程序区; (2)静态存储区; (3)动态存储区。,

15、返回,下一页,8.12 变量的存储类型,全局变量和静态变量存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序运行完毕就释放,在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。动态存储区存放以下数据: (1)函数的形式参数; (2)自动变量 (3)函数调用时的现场保护和返回地址。 这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。,返回,下一页,上一页,8.12 变量的存储类型,8.12.2 auto变量 函数中的局部变量,如不专门声明为static存储类型,都是动态地分配存储空间的,其数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在

16、复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量,自动变量用关键字auto作存储类型的声明。,返回,下一页,上一页,8.12 变量的存储类型,8.12.3用static声明局部变量 有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。 8.12.4 register变量 为了提高效率,C语言允许将局部变量的值放在CPU的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。,返回,下一页,上一页,8.12 变量的存储类型,8.12.5用extern声明外部变量 外部变量(即全局变量)是在函数的外部定义的,它的作用域从变量定义处开始,到本程序文件的末尾。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”,表示该变量是一个己经定义了的外部变量。有了此声明,就可以从“声明”

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

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

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