第七章 函数.ppt_第1页
第七章 函数.ppt_第2页
第七章 函数.ppt_第3页
第七章 函数.ppt_第4页
第七章 函数.ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 函数,一个大的程序包含若干子程序模块,每一个模块用来实现一个特定的功能,在C语言中,每一个子程序就是一个函数。一个C程序是由一个主函数和若干子函数组成,由主函数调用其它函数,其它函数之间也可以相互调用,一个函数可以被多次调用,也可以调用其它函数多次。一个C程序从main函数开始执行,在main函数中结束整个程序的运行,在C 中所有函数都是平行的,即函数的定义是相互独立的,不能嵌套定义,其它函数不能调用main函数,函数可分为标准函数和用户自定义函数两类,也可以区别为有参函数和无参函数。,函数的定义,无参函数的定义 形式:类型标识符 函数名() 声明部分 执行部分 操作:定义一个函数 有

2、参函数的定义 形式:类型标识符 函数名(形式参数表列) 声明部分 执行部分 操作:定义一个函数,注意:类型标识符确定函数返回值的类型,在一个函数中如果需要带回一个返回值,则在函数的语句里必然包含一个return语句,其形式是return(表达式),而表达式的类型必须与定义是函数的类型保持一致。 在C 中可以允许空函数。 在C 中,形式参数的定义可以放在圆括号内,也可以放在函数定义中的第二条语句。,函数的参数,在函数调用时,主调函数和被调函数之间存在数据传递关系,函数之间数据的传递是通过参数来完成的。函数定义时函数名后面的参数称为形式参数,函数调用时函数名后面的参数称为实际参数。 函数定义时形参

3、只具有形式的意义,它们在内存里并不分配存储单元,在函数定义时一定要指明形以在的类型,函数调用时编译系统就会对形参分配存储单元。实参可以是一个运算量,它们必须有确定的值,实参与形参的类型应当兼容。,在C中规定,实参变量对形参变量的数据传递是值传递,是单向传递,只能是实参传递给形参,不能回传。因此在执行函数调用时,形参的值的变化并不影响主调函数中实参变量的值。 函数的返回值是通过return语句来完成的。表达式是 return(表达式) 在一个函数中,可以不只一个函数返回语句,函数执行到哪一个,则那一个就起作用。,函数有一个返回值,这个值应当属于某一个确定的类型,因此我们在定义这个函数时就应当指定

4、这个函数的类型,一般来说,return中表达式的类型与定义函数时函数的类型要保持一致,如果不一致,则以定义函数时指定的类型为准。 函数中可以没有return语句,即用户不需要一个确定的值,这时函数并不是不带回值,只是它带回了一个不确定的值。因此在这一种情况下,为了明确表示不带回值,则可以用void来这类型的函数。,函数的调用,函数调用的一般形式 形式:函数名(实参表列) 操作:调用一个函数。,说明:(1)函数调用如果单独加分号就构成一条语句,也可以作为一个运算量出现在表达式中,还可以作为实际参数出现在函数的调用中。 (2)函数定义时的参数是形式参数,它是由变量构成,它没有确定的值,只具有形式上

5、的意义,函数调用时的参数称为实际参数,可以是表达式,它必须有确定的值。 (3)函数定义和调用时参数可以没有,但括号不能省略,如果参数不只一个,参数之间用逗号分隔开。实参和形参的个数和类型必须匹配,它们按顺序对应并一一传递数据。 (4)一个函数要调用另一个函数,前一个函数称为主调函数,后一个称为被调函数,它必须要求被调函数必须是已经存在的函数,同时在主调函数中对被调函数作一个声明,声明一般放在主调函数的开始部分,如果是一个库函数则需要用头文件包含到该文件中。,(5)函数的定义和函数的声明不是一回事,函数的定义是一个完整独立的函数单位,而声明只是通知编译系统这个函数的具体形式,声明形式:类型标识符

6、 函数名(形式参数表列);函数的声明也称函数原型,它通知编译系统,使编译有章可循。函数声明时函数的类型、函数名字、参数个数类型都要一一匹配。 (6)在以下几种情况下函数可以不声明,被调函数在主调函数之前,在一个程序的开始,函数的外部已经对函数进行了声明,如果函数是整型。 (7)在C 中,各个函数的定义是相互平行的,它们是独立的单位,但是在调用时,可以嵌套调用,即在调用一个函数的过程中又调用另一个函数。,例:素数 用弦截法求方程的根,155页,(8)在C 中,一个函数在调用另一个函数的过程中直接或间接地调用本身,这称为函数的递归调用,其分两种情况,直接递归和间接递归,为了有效的终止递归,一般要采

7、用if语句来终止。直接递归分两步:回推和递推。例书上160页。,数组作为函数的参数,它分两种情况,一个是数组元素作为函数的参数,数组元素相当一个变量,用法与变量相同,例:164页。第二种情况是数组名作为函数的参数,在这种情况下在主调函数和被调函数中要分别定义数组,并且类型要一致,在用数组名作为函数参数时,它不是把数组元素的值传递给形参,而是把实参数组的首地址传递给形参,在调用过程中两个数组共用同一段内存单元。例书上165页。,局部变量和全局变量,变量的作用域:一个变量起作用的范围。据此可把变量分为局部变量和全局变量。 局部变量:在一个函数内部定义的变量是内部变量,其作用域是该函数,函数以外不能

8、使用这个变量。因此主函数中定义的变量也只在主函数内使用,而不会在整个程序中有效。不同函数中可以使用相同的变量名,它们代表不同的对象,形式参数也是局部变量。 全局变量:一个C程序可以包含若干函数,在各个函数之外定义的变量就称为外部变量,也称全局变量,其作用域是从定义变量的位置开始到程序结束,可以为该和谐中其他函数所共用。在一个函数中既可以使用本函数的局部变量也能使用有效的全局变量。,(1)全局变量增加了一个程序各个函数之间数据联系的渠道,因为一个全局变量的作用域是从定义开始到程序结束,其后面的函数都可以引用它,全局变量的值在一个函数中发生改变,就会对后面函数引用该变量的值产生影响。 (2)全局变

9、量在程序的全部执行过程中都占用存储单元,不是在需要时才建立,同时全局变量降低了程序的可移植性,在模块化程序里,要求模块内聚性强,耦合性弱,全局变量降低了程序的清晰性。 (3)在一个函数里如果全局变量与局部变量同名,则全局变量被屏蔽。,例170.,变量的生存期:指变量值的存在时间,据此可把变量分为静态存储变量和动态存储变量。 在C 中供用户使用的内存存储空间可以分三个部分:程序区、静态存储区和动态存储区。程序存放在程序区中,而数据存放在静态存储区和动态存储区中。全局变量全部放在静态区中,从程序开始执行时分配存储单元,程序执行完毕时释放存储单元,故其也称静态存储变量。动态存储区存放以下数据:形参、

10、自动变量和函数调用时的现场保护和返回地址。,在C 中每一个变量和函数有两个属性:数据类型和存储方式,存储方式分为两类:静态存储和动态存储,具体又分四种:自动的、静态的、寄存器的和外部的。 自动变量可用auto定义,其可省略,如不特别声明的局部变量、形参变量和函数内部定义的变量。 静态变量可用static定义,全局变量和局部变量都可以采用它来进行声明,以保留变量在程序运行过程中的值。 用register定义寄存器变量,它是一种局部变量,其将变量的值直接放在CPU的寄存器中。一般是将使用频繁的变量放在寄存器中,可以提高存取速度。 全局变量的作用域是在定义处到程序结束,如果想在之前就对它进行引用,则

11、在引用之时要用关键字extern进行声明。一个C程序可以包含多个源文件,如果要在几个文件中使用同一变量,则只需要在一个文件中定义而在其它文件里定义为外部变量。 关于声明与定义 声明包含定义。,内部函数和外部函数,函数本质上是全局的。但可以指定函数不能被其它文件调用。 在定义内部函数时只需在函数定义之前加上一个static即可,内部函数又称静态函数。 如果在定义函数时在前面加上extern,则表明这是一个外部函数,可以被其它文件调用。但其它文件在调用时需做声明。,预处理命令,可以在C程序中加入一些预处理命令以改进程序设计环境提高编译效率,但它不是C语言本身的组成部分。C提供的预处理功能主要有三种

12、:宏定义、文件包含和条件编译。 (1)不带参数的宏定义 形式:#define 标识符 字符串 操作:将标识符(宏名)代替指定字符串。 在预编译时,将宏名替换成字符串,这个过程称为宏展开。宏展开只做简单的转换,不作正确性检查,它不是C语句,不在末尾加分号,宏名的作用域是从定义始到文件结束。可以用#undef命令终止宏定义,在进行宏定义时可以引用已定义的宏,层层置换。宏定义不分配存储空间。,(2)带参数的宏定义 形式:#define 标识符(参数表) 字符串 在宏替换过程中还要进行参数替换。注意s(3+2) (3)文件包含 文件包含指在一个源文件中将另一个源文件的内容全部包括进来,在C 中采用#include “文件名”或#include ,它可以节省重复劳动。注意被包含的是源文件,然后作为一个源程序进行编译得到一个目标文件。可以层层包含。,(4)条件编译 有时我们只对程序中部分内容进行编译,这即条件编译,其形式可分为:#ifdef 标识符 程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论