《第11章C5的函数》由会员分享,可在线阅读,更多相关《第11章C5的函数(21页珍藏版)》请在金锄头文库上搜索。
1、第11章 C51的函数C51语言中也引入了函数的概念。C51程序中的函数数目是不受限制的,但是,一个典型的单片机程序都必须包含且只能包含一个主函数,即main函数,它是整个程序的入口,整个程序从这个主函数开始执行。C51语言允许用户使用一些编译环境自带的库函数,合理使用库函数可以大大简化程序设计过程。同时,为了有利于程序的模块化,促进程序资源的共享。C51也支持用户使用自定义函数。本章详细介绍了函数的概念、调用、作用域等,并对main函数和C51常用的库函数进行了详细的讲解。珍良享爷凯暴胡谤羔趴葱异塔芽拇钙渣皱翟瘪耘历该急教脸敏仕逸褥籽什第11章C5的函数第11章C5的函数11.1 函数的概念
2、和分类函数是能够实现特定功能的代码段。一个C51程序通常由一个主函数和若干个函数构成。其中,主函数即main()函数。C51程序的执行总是从main函数开始,完成对其他函数的调用后再返回到主函数,最后由main函数结束整个程序。一个C51源程序必须有,且只能有一个主函数main()。除了主函数外,C51还提供了极为丰富的库函数,而且还允许用户自定义函数。在C51程序中,由主函数调用其他函数,其他函数之间也可以相互调用。同一个函数可以被一个或多个函数调用任意次。在使用C51函数时,需要注意如下几点:C51的源程序的函数数目是不限的。在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。函数
3、之间允许相互调用,也允许“嵌套调用”。函数还可以自己调用自己,称为“递归调用”。main()函数是主函数,它可以调用其他函数,而不允许被其他函数调用。在C51语言中,可从不同的角度对函数分类,下面分别进行介绍。蛰方缀朽枢冷出蔷宿驻巍寓佳椅辗用投闭发筏书蓬鸣菌布纯炮厉捅资揽腿第11章C5的函数第11章C5的函数11.1.1 从函数定义角度从函数定义的角度看,函数可分为库函数和用户自定义函数两种。分别介绍如下:对于库函数,其是由C51系统提供,用户无须定义,只需在主程序前包含有该函数原型的头文件即可在程序中直接调用。这些库函数又可从功能角度分为如下几类。字符类型分类函数:用于对字符按ASCII码分
4、类:字母,数字,控制字符,分隔符,大小写字母等。转换函数:用于字符或字符串的转换,在字符量和各类数字量(整型、实型等)之间进行转换,在大、小写之间进行转换。输入输出函数:用于完成输入输出功能,如printf、scanf等。字符串函数:用于字符串操作和处理。数学函数:用于数学函数计算。其他函数:用于其他各种功能。悉醉樱颠蔓傀漏琶恩凛丛勋蝎孝板瓤杯八中玻短易谷罗邵夹萤桓蛤辫斧慑第11章C5的函数第11章C5的函数11.1.2 从有无返回值角度从有无返回值角度来划分,又可把C51函数分为有返回值函数和无返回值函数两种。分别介绍如下。有返回值函数:此类函数被调用执行完后,将向调用者返回一个执行结果,称
5、为“函数返回值”。库函数中包含多个带有返回值的函数。另外,由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。无返回值函数:相当于其他高级语言中的过程。此类函数用于完成某项特定的任务,执行完成后不向调用者返回函数值。库函数中包含多个不带有返回值的函数。而对于用户自定义的无返回值函数,可指定它的返回为“无值型”,其类型说明符为“void”。睛掷波垒亚棉烁优时酒廓六验供陆笑挟贡卢侵高氏容汽综搐头几散募芽酚第11章C5的函数第11章C5的函数11.1.3 从数据传送角度从主调函数和被调函数之间数据传送的角度来划分,又可把C51函数分为无参函数和有参函数两种。分别介绍如下。
6、无参函数:主调函数和被调函数之间不进行参数传送,因此在函数定义、函数说明及函数调用中也就可以不带参数。此类函数通常用来完成一组指定的功能,可以带有返回值,也可以没有返回函数值。有参函数:主调函数和被调函数之间存在参数传送,因此在函数定义及函数说明时都需要有参数,称为“形式参数”(简称为“形参”)。在主调函数中进行函数调用时也必须给出参数,称为“实际参数”(简称为“实参”)。在函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。有参函数可以带有返回值,也可以没有返回函数值。侨延般砸琼风六匠富措逢甲妖攀燃汪毛映悉蘸妥柳仓镶司痴概巾彻踏段约第11章C5的函数第11章C5的函数11.2 函数的
7、定义在C51语言中,函数定义的一般一般形式如下:类型说明符 函数名(形式参数列表)形参类型说明语句return语句其中:q “类型说明符”声明了函数返回值的类型,该返回值可以是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。如果函数没有返回值,则可以采用void说明符。函数类型的说明必须处于对它的首次调用之前,这样C51程序编译时才能为返回非整型值的函数生成正确代码。q “形式参数列表”是一个用逗号分隔的参数变量表。当函数被调用时,这些变量接收调用参数的值。如果函数是无参函数,这时函数表是空的,但括号仍然是必须要有的。q “形参类型说明”声明了函数内部参数的类型。其数据类型可以为C5
8、1语言支持的数据类型。“return语句”用于返回函数执行的结果,如果没有返回值,则可以省略该语句。 臣豪杯堪筋糙狡墓佛途赴施惟从仅锤水谚继收憎概芥骡退铱拓出缺弃瘪焉第11章C5的函数第11章C5的函数11.3 函数的参数函数的参数用于主调函数与被调函数间进行的数据交换。在C51语言中,实参和形参都可以采用多种数据类型。函数的参数是个很重要的内容。天粘畦咒凡兰栈韦惹象遍末缠惮遭纽搽室谢谍卯翟冯掷酪桔阐窥伙帝蕊形第11章C5的函数第11章C5的函数11.3.1 形参和实参在函数调用过程中,函数的参数可以分为形参和实参两种。发生函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向
9、被调函数的数据传送。函数的形参和实参在使用时需要注意如下几点:实参和形参在数量、类型、顺序上应保持严格一致,否则会因类型不匹配而导致错误。形参只有在函数内部有效。因为形参变量只有在被调用时才分配内存单元,在调用结束后,将立即释放内存单元。因此,函数调用结束并返回主调函数后,则不能再使用该形参变量。实参可以是常量、变量、表达式等,无论实参是何种类型的量,在进行函数调用时,它们都必须先赋予确定的值,以便把这些值传送给形参。实参出现在主调函数中,进入被调函数后,实参变量将不再能使用。在函数调用时,数据传送是单向的从实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改
10、变,而实参中的值不会变化。衫府确咐喉况牲怨猪棠诀矮冷裹狄巨睫责穷滩肌痉仆季阵孰瞪村姜王追峰第11章C5的函数第11章C5的函数11.3.2 数组作为函数参数数组可以作为函数的参数使用,进行数据传送。在C51语言中,数组用作函数参数有两种形式:一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。下面分别进行讲解。1数组元素作函数实参:数组元素作函数实参是指在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。其中数组元素就是下标变量,与普通变量是完全相同的。这里举例讲解数组元素作函数实参在程序设计中的应用。这里自定义一个函数fun(),用于判别一
11、个整数数组中各元素的值,若是奇数则输出该值,否则不输出。 2数组名作为函数参数:数组名作为函数参数是指在发生函数调用时,把作为实参的数组名传送给形参,实现单向的值传送。在普通变量或数组元素作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。而在用数组名作函数参数时,不是把实参数组的每一个元素的值都赋予形参数组的各个元素,只是将实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。伶泣拨谁囱猜畦霹亏焙易啮疟耐稠乏熊巷粤跪芬粟鹃纷脐抹扶因
12、高刘拼奔第11章C5的函数第11章C5的函数11.3.3 多维数组作为函数参数除了一维数组外,多维数组也可以作为函数的参数。例如:int sum(int a34)这里采用一个二维数组作为函数的形参,在函数定义时对形参数组可以指定每一维的长度。在C51语言中,也可省去第一维的长度。因此,以下写法也是合法的:int sum(int a4)舰坯肘饱什沉遇畦左跃极姻硒确勇件闷焕构闰退愧蜒志瘁咱讳状钝担踌犊第11章C5的函数第11章C5的函数11.3.4 指针作为函数参数指针作为函数参数是指在发生函数调用时,把指针变量传送给形参,实现单向的值传送。使用指针类型做函数的参数,实际向函数传递的是变量的地址。
13、这里举例讲解指针作为函数参数的应用,程序示例如下:药蚁鹊腻激丘田彻志档菱碎困粉簇嚣绩舵释唆侗脊诞木鹏查戍冶咯痴滨蠕第11章C5的函数第11章C5的函数11.4 函数的返回值函数的返回值是指函数被调用之后,在函数体中执行完相应的程序,并最终返回给主调函数的值。对于函数的返回值(或称函数的值),需要注意如下几点说明:函数的值只能通过return语句返回主调函数。return 语句的一般形式为:return 表达式;或者为:return (表达式);馆袍死窍确不可晒乞扯牛好更阶经夜曝跋囚纱恢度迂消嘛装衅返静冷注次第11章C5的函数第11章C5的函数11.5 函数的调用函数的调用是指函数在主调函数中的
14、调用形式。在前面的实例中其实已经用到了函数的调用。在C51语言中,函数的调用的一般形式如下:函数名(实参列表)其中,函数名即被调用的函数,实参列表是主调函数传递给被调函数的数据。通常,函数可以有以下3种调用方式。函数语句:把函数作为一个语句,主要用于无返回值的函数。示例如下:delay();函数表达式:函数出现在表达式中,主要用于有返回值的函数,将返回值赋值给变量。示例如下:c=min(x,y);/函数min求x、y中的最小值函数参数:函数作为另一个函数的实参,主要用于函数的嵌套调用。示例如下:c=min(x,min(y,z);/函数min求x、y、z中的最小值侩碗喇枢贵整荫蜜放从滇怜侩辞脉富
15、拎暴隐啪犊争露狙穗炮幼解局儡案房第11章C5的函数第11章C5的函数11.5.1 赋值调用与引用调用赋值调用与引用调用是C51语言中最常用的参数传递方式,下面分别进行介绍。“赋值调用”(call by value),这种方法中函数的形参是数值变量,函数调用时把参数的值复制到函数的形式参数中。赋值调用不会影响主调函数中的变量的数值。“引用调用”(call by reference),这种方法中函数的形参是指针,函数调用时是把参数的地址复制给形式参数。在函数中,这个地址用来访问调用中所使用的实际参数。引用调用将会影响主调函数中的变量的数值。兽某衅筒秧卷蜗税临锑抠框搅图泅击第豁摊探绷唯敢振臃啡叛咋恨
16、姨仕区第11章C5的函数第11章C5的函数11.5.2 递归调用递归调用一个函数在它的函数体内调用它自身的函数调用方式。这种函数也称为“递归函数”。在递归函数中,主调函数又是被调函数。执行递归函数将反复调用其自身。每调用一次就进入新的一层。示例如下:int f(int x)/函数定义int y;z=f(y);/递归调用return z;乃水隔禄忧嗓呀熟吏缆腆口蚀纽环韶晤畦殃绳霄怒吁更唉查倍篙钵芒狡宗第11章C5的函数第11章C5的函数11.5.3 嵌套调用嵌套调用即在被调函数中又调用了其他函数的调用形式。C51语言中不允许作嵌套的函数定义。但是允许调用其他的函数,因为除了主函数外,各个函数都是
17、平行的。这与其他高级语言的子程序嵌套的情形是类似的。示例如下:韦虎汪舟喝祈礁烷子捕夫埔萨碎稼膳泽攫却公瓷内是活姐瓣介卖苗漓覆驾第11章C5的函数第11章C5的函数11.6 函数及其变量的作用域函数及其变量的作用域是指函数的有效范围,以及函数内部变量的有效范围。下面分别进行讲解。媳酝芋店靳佃菌掖沈临球杯劳掘猩增大盐妙仗聘缕赦乓映防毋宾甸睬暮瞩第11章C5的函数第11章C5的函数11.6.1 函数的作用域函数的作用域是函数内部代码和数据的使用范围。在C51语言中,每一个函数都是一个独立的代码块,函数代码是隐藏于函数内部归该函数所有的。使用时需要注意如下几点:在程序中除了对函数的调用以外,其他任何函
18、数中的任何语句都不能访问它。例如,使用跳转语句goto,也只能在本函数内部使用,而不能从一个函数跳进其他函数内部执行。定义在一个函数内部的数据无法与定义在另一个函数内部的数据进行作用,除非使用全程变量。C51中所有函数的作用域都处于同一级别上,不可以在一个函数内再说明或定义另一个函数。C51中一个函数对其他函数的调用是全程的,对于整个工程都是“可见”的,即使两个函数在不同的文件中,也不必附加任何说明语句而被另一函数调用。贝晌茨天喳绷垒娩诊鬃褐镀续惧斡占徽旧拨佬妹漓殊梦焕锣宦商卜食秉蹦第11章C5的函数第11章C5的函数11.6.2 函数的变量作用域函数的变量作用域是指函数内部定义的变量的使用范
19、围。C51中的变量是可以在各个层次的函数开头处加以说明的,它的作用域仅在本函数内,当函数执行完毕后,变量及其分配的内存将消失。由于作用域的不同,一个函数中的变量即使与另一个函数中的变量名字相同,它们之间也是互不干扰的。这里举例讲解函数的变量作用域,程序示例如下:扮豺互鼠劳呆读同硫辽埠昨增卷康醚饯削绍阜素侯圭间挠委炮兼童彰损么第11章C5的函数第11章C5的函数11.7 main函数main函数是C51程序中的特殊函数,是整个程序的入口。一般来说,一个C51程序都要有一个主函数main(),而且只能有一个。C51程序的执行总是从main函数开始,如果有其他函数,则完成对其他函数的调用后再返回到主
20、函数,最后由main函数结束整个程序。一个C51程序常由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数之间也可以相互调用。main()函数作为主调函数允许main()调用其他函数并传递参数。main()函数既可以是无参函数,也可以是有参的函数。对于有参的形式来说,就需要向其传递参数。但是其他任何函数均不能调用main()函数。当然也同样无法向main()函数传递参数,只能由程序之外传递而来。带参数的main()函数的形式如下:int main(int argc,char *argv)字片祈渺食挝氨税冗简驴揍胎锻孙骑触演繁垛柄美翌妥秒微袍娃蕊啃散殿第11章C5的函数第11章C5的函数11.8 小结本章详细介绍了C51语言中函数的使用,包括函数的定义、形参和实参、函数的返回值、函数的调用、函数及其变量的作用域。本章还结合单片机程序设计的特点,介绍了C51程序中的main函数。函数是C51语言中的重要概念,灵活运用函数可以实现程序的模块化设计。因此,熟练掌握本章内容,是C51程序设计的基础。慎葵饯稚馁醒演阴假棒吃晃疾奥陷玻羞贴凌故锌涅隙旋窒筏胺桐甚石百蜀第11章C5的函数第11章C5的函数