第11章C51的函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 函数名(实参列表) • 其中,函数名即被调用的函数,实参列表是主调函数传递
给被调函数的数据。通常,函数可以有以下3种调用方式。 • 函数语句:把函数作为一个语句,主要用于无返回值的函
数。示例如下: • delay(); • 函数表达式:函数出现在表达式中,主要用于有返回值的
函数,将返回值赋值给变量。示例如下: • c=min(x,y);
• 函数的值只能通过return语句返回主调函数。 return 语句的一般形式为:
• return 表达式; • 或者为: • return (表达式);
11.5 函数的调用
• 函数的调用是指函数在主调函数中的调用形式。在前面的 实例中其实已经用到了函数的调用。在C51语言中,函数的 调用的一般形式如下:
• C51中一个函数对其他函数的调用是全程的,对于整个工程 都是“可见”的,即使两个函数在不同的文件中,也不必 附加任何说明语句而被另一函数调用。
11.6.2 函数的变量作用域
• 函数的变量作用域是指函数内部定义的变量的使用范围。C51中的变量是 可以在各个层次的函数开头处加以说明的,它的作用域仅在本函数内,当 函数执行完毕后,变量及其分配的内存将消失。由于作用域的不同,一个 函数中的变量即使与另一个函数中的变量名字相同,它们之间也是互不干 扰的。这里举例讲解函数的变量作用域,程序示例如下:
11.6 函数及其变量的作用域
• 函数及其变量的作用域是指函数的有效范围,以 及函数内部变量的有效范围。下面分别进行讲解。
11.6.1 函数的作用域
• 函数的作用域是函数内部代码和数据的使用范围。在C51语 言中,每一个函数都是一个独立的代码块,函数代码是隐 藏于函数内部归该函数所有的。使用时需要注意如下几点:
//函数min求x、y中的最小值 • 函数参数:函数作为另一个函数的实参,主要用于函数的
嵌套调用。示例如下: • c=min(x,min(y,z));
//函数min求x、y、z中的最小值
11.5.1 赋值调用与引用调用
• 赋值调用与引用调用是C51语言中最常用的参数传 递方式,下面分别进行介绍。
• “赋值调用”(call by value),这种方法中函 数的形参是数值变量,函数调用时把参数的值复 制到函数的形式参数中。赋值调用不会影响主调 函数中的变量的数值。
• 在程序中除了对函数的调用以外,其他任何函数中的任何 语句都不能访问它。例如,使用跳转语句goto,也只能在 本函数内部使用,而不能从一个函数跳进其他函数内部执 行。
• 定义在一个函数内部的数据无法与定义在另一个函数内部 的数据进行作用,除非使用全程变量。
• C51中所有函数的作用域都处于同一级别上,不可以在一个 函数内再说明或定义另一个函数。
• 2.数组名作为函数参数:数组名作为函数参数是指在发生函数调 用时,把作为实参的数组名传送给形参,实现单向的值传送。
• 在普通变量或数组元素作函数参数时,形参变量和实参变量是由 编译系统分配的两个不同的内存单元。在函数调用时发生的值传 送是把实参变量的值赋予形参变量。而在用数组名作函数参数时, 不是把实参数组的每一个元素的值都赋予形参数组的各个元素, 只是将实参数组的首地址赋予形参数组名。形参数组名取得该首 地址之后,也就等于有了实在的数组。实际上是形参数组和实参 数组为同一数组,共同拥有一段内存空间。
• 实参和形参在数量、类型、顺序上应保持严格一致,否则 会因类型不匹配而导致错误。
• 形参只有在函数内部有效。因为形参变量只有在被调用时 才分配内存单元,在调用结束后,将立即释放内存单元。 因此,函数调用结束并返回主调函数后,则不能再使用该 形参变量。
• 实参可以是常量、变量、表达式等,无论实参是何种类型 的量,在进行函数调用时,它们都必须先赋予确定的值, 以便把这些值传送给形参。实参出现在主调函数中,进入 被调函数后,实参变量将不再能使用。
• 带参数的main()函数的形式如下: • int main(int argc,char *argv[])
11.8 小结
• 本章详细介绍了C51语言中函数的使用,包括函数 的定义、形参和实参、函数的返回值、函数的调 用、函数及其变量的作用域。本章还结合单片机 程序设计的特点,介绍了C51程序中的main函数。 函数是C51语言中的重要概念,灵活运用函数可以 实现程序的模块化设计。因此,熟练掌握本章内 容,是C51程序设计的基础。
11.7 main函数
• main函数是C51程序中的特殊函数,是整个程序的入口。一 般来说,一个C51程序都要有一个主函数main(),而且只能 有一个。C51程序的执行总是从main函数开始,如果有其他 函数,则完成对其他函数的调用后再返回到主函数,最后 由main函数结束整个程序。
• 一个C51程序常由一个主函数和若干个函数构成。由主函数 调用其他函数,其他函数之间也可以相互调用。main()函 数作为主调函数允许main()调用其他函数并传递参数。 main()函数既可以是无参函数,也可以是有参的函数。对 于有参的形式来说,就需要向其传递参数。但是其他任何 函数均不能调用main()函数。当然也同样无法向main()函 数传递参数,只能由程序之外传递而来。
第11章C51的函数
11.1 函数的概念和分类
• 函数是能够实现特定功能的代码段。一个C51程序通常由一个主函 数和若干个函数构成。其中,主函数即main()函数。C51程序的执 行总是从main函数开始,完成对其他函数的调用后再返回到主函 数,最后由main函数结束整个程序。一个C51源程序必须有,且只 能有一个主函数main()。
• 示例如下: • int f(int x)
//函数定义 •{ • int y; • z=f(y);
//递归调用 • return z; •}
11.5.3 嵌套调用
• 嵌套调用即在被调函数中又调用了其他函数的调用形式。 C51语言中不允许作嵌套的函数定义。但是允许调用其他的 函数,因为除了主函数外,各个函数都是平行的。这与其 他高级语言的子程序嵌套的情形是类似的。示例如下:
• 1.数组元素作函数实参:数组元素作函数实参是指在发生函数调 用时,把作为实参的数组元素的值传送给形参,实现单向的值传 送。其中数组元素就是下标变量,与普通变量是完全相同的。这 里举例讲解数组元素作函数实参在程序设计中的应用。这里自定 义一个函数fun(),用于判别一个整数数组中各元素的值,若是奇 数则输出该值,否则不输出。
• 在函数调用时,数据传送是单向的从实参传送给形参,而 不能把形参的值反向地传送给实参。因此在函数调用过程 中,形参的值发生改变,而实参中的值不会变化。
11.3.2 数组作为函数参数
• 数组可以作为函数的参数使用,进行数据传送。在C51语言中,数 组用作函数参数有两种形式:一种是把数组元素(下标变量)作 为实参使用;另一种是把数组名作为函数的形参和实参使用。下 面分别进行讲解。
11.2 函数的定义
• 在C51语言中,函数定义的一般一般形式如下:
• 类型说明符 函数名(形式参数列表)
• 形参类型说明
•{
• 语句
• return语句
•}
• 其中:
•q
“类型说明符”声明了函数返回值的类型,该返回值可以
是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。
如果函数没有返回值,则可以采用void说明符。函数类型的说明必须
11.3.3 多维数组作为函数参数
• 除了一维数组外,多维数组也可以作为函数的参 数。例如:
• int sum(int a[3][4]) • 这里采用一个二维数组作为函数的形参,在函数
定义时对形参数组可以指定每一维的长度。在C51 语言中,也可省去第一维的长度。因此,以下写 法也是合法的: • int sum(int a[][4])
11.3.4 指针作为函数参数
• 指针作为函数参数是指在发生函数调用时,把指 针变量传送给形参,实现单向的值传送。使用指 针类型做函数的参数,实际向函数传递的是变量 的地址。这里举例讲解指针作为函数参数的应用, 程序示例如下:
11.4 函数的返回值
• 函数的返回值是指函数被调用之后,在函数体中 执行完相应的程序,并最终返回给主调函数的值。 对于函数的返回值(或称函数的值),需要注意 如下几点说明:
义。 • 函数之间允许相互调用,也允许“嵌套调用”。 • 函数还可以自己调用自己,称为“递归调用”。 • main()函数是主函数,它可以调用其他函数,而不允许被其他函
数调用。 • 在C51语言中,可从不同的角度对函数分类,下面分别进行介绍。
11.1.3 从数据传送角度
• 从主调函数和被调函数之间数据传送的角度来划分,又可 把C51函数分为无参函数和有参函数两种。分别介绍如下。
• “return语句”用于返回函数执行的结果,如果没有返回值,则可以
省略该语句。
11.3 函数的参数
• 函数的参数用于主调函数与被调函数间进行的数 据交换。在C51语言中,实参和形参都可以采用多 种数据类型。函数的参数是个很重要的内容。
11.3.1 形参和实参
• 在函数调用过程中,函数的参数可以分为形参和实参两种。 发生函数调用时,主调函数把实参的值传送给被调函数的 形参,从而实现主调函数向被调函数的数据传送。函数的 形参和实参在使用时需要注意如下几点:
• 除了主函数外,C51还提供了极为丰富的库函数,而且还允许用户 自定义函数。在C51程序中,由主函数调用其他函数,其他函数之 间也可以相互调用。同一个函数可以被一个或多个函数调用任意 次。
• 在使用C51函数时,需要注意如下几点: • C51的源程序的函数数目是不限的。 • 在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定
处于对它的首次调用之前,这样C51程序编译时才能为返回非整型值
的函数生成正确代码。
•q
“形式参数列表”是一个用逗号分隔的参数变量表。当函
数被调用时,这些变量接收调用参数的值。如果函数是无参函数,这
时函数表是空的,但括号仍然是必须要有的。
•q
“形参类型说明”声明了函数内部参数的类型。其数据类
型可以为C51语言支持的数据类型。
• 无参函数:主调函数和被调函数之间不进行参数传送,因 此在函数定义、函数说明及函数调用中也就可以不带参数。 此类函数通常用来完成一组指定的功能,可以带有返回值, 也可以没有返回函数值。
• 有参函数:主调函数和被调函数之间存在参数传送,因此 在函数定义及函数说明时都Leabharlann Baidu要有参数,称为“形式参数” (简称为“形参”)。在主调函数中进行函数调用时也必 须给出参数,称为“实际参数”(简称为“实参”)。在 函数调用时,主调函数将把实参的值传送给形参,供被调 函数使用。有参函数可以带有返回值,也可以没有返回函 数值。
• “引用调用”(call by reference),这种方法 中函数的形参是指针,函数调用时是把参数的地 址复制给形式参数。在函数中,这个地址用来访 问调用中所使用的实际参数。引用调用将会影响 主调函数中的变量的数值。
11.5.2 递归调用
• 递归调用一个函数在它的函数体内调用它自身的函数调用 方式。这种函数也称为“递归函数”。在递归函数中,主 调函数又是被调函数。执行递归函数将反复调用其自身。 每调用一次就进入新的一层。
相关文档
最新文档