函数教学课件_第1页
函数教学课件_第2页
函数教学课件_第3页
函数教学课件_第4页
函数教学课件_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第五章

函数

目标

口熟练掌握函数的结构

口熟练掌握函数声明和原型

口熟练掌握函数的调用

口理解函数的嵌套调用和递归调用

口熟练掌握按值传递

□掌握变量的作用域和存储类型

口理解函数的作用域

函数

口独立的程序段

口执行一个具体的、明确定义的任务

口易于编写、理解、调试和维护

口将需要多次执行的一组指令定义为函数

函数的定义结构

返回值的数据类型][有效的函数名h形式蓼数

type^specifierfunctionjhame(arg

执行部分

)

A

函数的参数

U函数的参数分为形参和实参两种,作用是实现数据传送。

口形参出现在函数定义中,只能在该函数体内使用。发生函

数调用时,调用函数把实参的值复制1份,传送给被调用

函数的形参,从而实现调用函数向被调用函数的数据传送。

口其它说明:

口实参可以是常量、变量、表达式、函数等。

口形参变量只有在被调用时,才分配内存单元;调用结

束时,即刻释放所分配的内存单元。

口实参和形参占用不同的内存单元,即使同名互不影响。

口在被定义的函数中,必须指定形参的类型

口实参与形参的类型应相同或赋值兼容。

形参和实参的示例

函数的参数

a2b3

VV

X2y3

注意:实参值a为3.5,而形参x为整型,

则将实数3.5转换成整数3,然后送到形参b。

字符型与整型可以互相通用。

7

函数返回值

通常,希望通过函数调用使主调函数能得到一个确定的值,

这就是函数的返回值。例如,max(2,3)的值是3.

□将控制权从函数传回主调程序intsquarer(intx)

口才巴return语句中的内容返回/*intx;*/

给主调程序

intj;

j=x*x;

return(j);

//returnx*x;

//returnj;

}

函数的数据类型

口在定义函数时,对函数类型的说明,应与return语句中、返

回值表达式的类型一致。

口如果返回的是一个整型值或者没有返回值,可以省略类型

标识符

口为了避免出现不一致,最好指定数据类型

(Jnt)squarer(intx)良好的程序设计习惯:为

/*intx;*/了使程序具有良好的可读

性并减少出错,凡不要求

intj;返回值的函数都应定义为

空类型;即使函数类型为

j=x*x;

整型,也不使用系统的缺

return。);省处理。、一

}

函数返回值说明

关于函数返回值的一些说明:

(1)函数的返回值是通过函数中的return语句获得的。

一个函数中可以有一个以上的return语句,执行到哪一个

return语句,哪一个语句起作用。return语句后面的括弧也可

以不要,如:"returnz;”等彳介于“return(z);"

(2)函数的返回值应当属于某一个确定的类型,在定义函数时

指定函数返回值的类型。在c语言中,凡不加类型说明的函数,自动按整型

处理

in

(3)在定义函数时指定的函数类型一般应该和return语句中的

表达式类型一致。

如果函数值的类型和return语句中表达式的值不一致,则以函数

类型为准。对数值型数据,可以自动进行类型转换。

(4)如果被调用函数中没有return,返回一个不确定值。对于

不带回值的函数,应当用“void”定义函数为“无类型”(或

称“空类型”)o此时在函数体中不得出现return语句。

数原型和函数声明

口在定义之前使用函数,必须声明,否则,一些编译器会返

回错误

口采用函数原型方式,对被调用函数进行说明,其一般格式

如下:

□函数类型函数名(数据类型[参数名儿数据类型[参数名2]...]);

#include<stdio.h>

voidaddress();

voidmain(){

address。;//编译通过

)

voidaddress()

)

调用函数

口函数调用的一般形式为:函数名([实际参数表]);

口调用函数时,函数名称必须与具有该功能的自定义函数名

称完全一致。

口实参在个数、类型和顺序与被调用函数的形参,必须一一

对应和匹配。如果类型不匹配,C编译程序修按赋值兼容

的规则进行转换。

函数调用条件

(1)首先被调用的函数必须是已经存在的函数(是库函数或用

户自己定义的函数)。

(2)如果使用库函数,还应该在本文件开头用#include命令将

调用有关库函数时所需用到的信息“包含”到本文件中来。

(3)如果使用用户自己定义的函数,而该函数的位置在调用它

的函数(即主调函数)的后面(在同一个文件中),应该

在主调函数中对被调用的函数作声明。

AA

文件包含

口文件包含:是指一1个源文件可以将另夕I1个源文件的全部

内容包含进来。

口作用:使编译系统把指定的被包含文件嵌入到带有

#include的源文件中。

□示意图:

file2.cfilel.hfilel.c

包含

B函数的声明

A函数的声明

定义和声明

注意:函数的“定义”和“声明”不是一回事。函数的定义是

指对函数功能的确立,包括指定函数名,函数值类型、形参及

其类型、函数体等,它是一个完整的、独立的函数单位。而函

数的声明的作用则是把函数的名字、函数类型以及形参的类型、

个数和顺序通知编译系统,以便在调用该函数时,编译系统能正

确识别函数并检查调用是否合法。(例如函数名是否正确,实

参与形参的类型和个数是否一致)。

注:系统不会检查参数名。

函数调用的嵌套

口函数的嵌套调用是指,在执行被调用函数时,被调用函数

又调用了其它函数

f2(){...}

fl0(

f2();

…//后续语句

}

main()

(

fl0;

...//后续语句

17

函数的递归调用

口一个函数在它的函数体内调用它自身称为递归调用。这种

函数称为递归函数。C语言允许函数的递归调用。在递归

调用中,主调函数又是被调函数。

□间接递归

口为了防止递归调用无终止地进行,必须在函数内有终止递

归调用的手段。常用的办法是加条件判断,满足某种条件

后就不再作递归调用,然后逐层返回。

直接调用间接调用

1ft

利用递归求阶乘

#include<stdio.h>

intfactorialint);

intmain(){

inti;

for(i=1;i<=10;i++)

printf(ui=%dfactorial:%d\n,,,i,factorial(i));

return0;

)

intfactorialintnumber){

if(number<=1)

return1;

else

return(number*factorial(number-1));

)

参数传递

□调用一个函数时,调用函数和被调用函数之间会

发生数据传递,有两种数据传递方式。

口按值传递

内存地址:100#

25

25

口按地址传递

内存地址:100#

100

25

按值传递

口变量的值被传递给被调函数,并且对这个值的任

何改变并不会影响被传变量的原始值

口默认情况下,函数参数都是按值传递的

□参数值是通过临时变量传递的

□所有操作都针对这些临时变量

21

逑曲^传递的几种方式

□主调函数与被调函数进行数据传递的方式有以下

几种:

口参数传递

□返回值

口全局变量:

口使用全局变量不符合程序设计中要求模块间“强内聚性、弱偶

合性”的原则。使这些函数依赖这些全局变量,因而使得这些

函数的独立性降低。

口使用全局变量过多,会降低程序的可读性和可维护性。

数组作为函数参数

一维数组元素作函或甚

数组元素作为函数的实参,与用变量作实参一样,是单向传

递,即“值传送”方式。

例如:voidswap(intxjnty);

调用swap(a[0],a[l]);

一维数组元素作函数形参?

一维数组作函数形参?

二维数组作函数形参?

雒数组作为参数例子

形钟卖参都用数组名,如:

voidf(intaiNO[],intnNum)

aiNO[0]=1;

aiN0[1]=2;

nNum=3;

}

voidmain()

intaiNO[10]={0},nNumber=5;

f(aiNO,nNumber);

printff6%d,%d,%d5\aiNO[0],aiN0[1],nNumber);

//观察这三个值有什么变化?

9A

数组作为函数形参

数组作函数形参注意点:

1、实参数组名代表数组元素的首地址。

而形参是用来接收从实参传递过来的数组首元素地址

2、在被调用函数中声明形参数组的大小为10,但在实际上,

指定大小是不起作用的,C编译器对形参数组大小不做检

查,只是将实参数组的首地址传给形参数组。

蔼部变量和全局变量

口局部变量

口在函数内部声明

口进入一个程序块时创建,退出该程序块时销毁

口形式参数

口在函数定义中被声明为参数

口在函数内部像局部变量一样使用

口全局变量

口在所有函数以外声明

□在程序的整个执行期间都拥有值

^态存储和动态存储

口变量从变量值存在的时间(即生存期)角度分:静态存

储方式和动态存储方式

口静态:由系统分配固定的存储空间,全局变量就存储在

静态存储区

口动态:系统根据需要进行动态的分配存储空间

在动态存储区存放一下数据:

1、函数形式参数用户区

2、自动变量(未加static声明)程序区

3、函数调用时的现场保护和静态存储区

返回地址

动态存储区

97

存储类别3-1

口内存中的存储区域包括下面几个部分:

□程序代码区:存放函数体的二进制代码

□静态区/全局区(static):全局变量和静态变量的存储

区域

口堆区(heap):程序员分配释放

口栈区(stack):由编译器自动分配释放,存放函数的

参数值,局部变量的值

90

存储类另3-2

口存储类别是数据在内存中的存储形式,是变量的

属性,使用的一般语法:

口存储类别数据类型变量名称;

□例如:

autointa;

staticintb;//静态

registerintI;//寄存器变量

extern

温馨提示

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

最新文档

评论

0/150

提交评论