七、用函数实现模块化程序设计——函数调用

1、调用函数

定义函数的目的是为了调用此函数。

1.1、函数调用的形式

函数调用的一般形式为 函数名(实参表列)
1、函数调用语句
把函数调用单独作为一个语句,这时不要求函数带回值,只要求函数完成一定的操作。
2、函数表达式
函数调用出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的计算。
3、函数参数
函数调用作为另一个函数调用时的实参。

1.2、函数调用时的数据传递

1、形式参数和实际参数
在调用有参函数时,主调函数和被调用函数之间有数据传递关系。在定义函数时函数名后面括号中的变量称为“形式参数”(简称“形参”)。
在主调函数中调用一个函数时,函数名后面括号里的参数称为“实际参数”(简称“实参”),实参可以是常量、变量和表达式,但是要求它们有确定的值。
2、实参和形参间的数据传递
在调用函数过程中,系统会把实参的值传递给被调用函数的形参(形参从实参得到一个值)。该值在函数调用期间有效,可以参加该函数的运算。
实参与形参的类型应相同或者赋值兼容。

1.3、函数调用的过程

  1. 在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元。在发生函数调用时,函数的形参才被临时分配内存单元。
  2. 将实参的值传递给对应的形参。
  3. 在执行被调用函数期间,由于形参已经有值,就可以利用形参进行有关的运算。
  4. 通过return语句将函数值带回到主调函数。执行return语句就把这个函数返回值带回到主调函数main,应当注意返回值的类型与函数类型一致。如果函数不需要返回值,则不需要return语句。这时函数的类型应定义为void类型。
  5. 调用结束,形参单元被释放。注意实参单元仍保留并维持原值,没有改变。如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值。实参和形参是在两个不同的存储单元,。
    注意:实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参,实参和形参在内存中占有不同的存储单元,实参无法得到形参的值。
    此处的“值传递”中的值是什么呢?
    如果是变量就是变量的值,如果是数组元素就是数组元素的值,如果是数组名就是该数组的首元素地址的值,如果是指针就是指针的所指向的地址值。

1.4、函数的返回值

  1. 通常希望通过函数调用使主调函数,能得到一个确定的值,这就是函数值(函数的返回值)。
  2. 函数的返回值是通过函数中的return 语句获得的。一个函数中可以有一个以上的return语句。执行到哪一个return,哪一个return语句就起作用。return后面的值可以是一个表达式。
  3. 函数值的类型。既然函数有返回值,这个值应当属于某个特定的类型,应当在定义函数时指定函数值的类型。
  4. 在定义函数时指定的函数类型一般应该和returrn语句中的表达式类型一致。
  5. 对于不带返回值的函数,应当用定义函数为“void类型”。这样就保证不使函数带回任何返回值。此时在函数体中不得出现return语句。

2、对被调用的函数的声明和函数原型

2.1、在一个函数中调用另一个函数(即被调函数)需要具备以下条件

  1. 被调用的函数必须是已经定义的函数(库函数或者用户自己定义的函数)。
  2. 如果使用库函数,应该在本文件开头用#include<stdio.h>,其中包含了输入输出库函数的声明。如果使用数学库,应该用#include<math.h>
  3. 如果使用用户自己定义的函数,而该函数的位置在调用它的函数(主调函数)的后面(同一文件中),应该在主调函数中对被调用的函数作声明。声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便遇到函数调用时,编译系统能够正确识别函数并检查调用是否合法。
  4. 使用函数原型作声明是C 的一个重要特点,能减少编写程序时可能出现的错误。由于函数声明的位置与函数调用语句的位置比较近,因此在写程序时便于就近参照函数原型来书写函数调用,不易出错。
  5. 对函数的定义和声明不是同一回事。函数的定义是指对函数功能的确立,函数的声明作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统。
  6. 如果已在文件的开头(在所有函数之前),已对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再作声明。写在所有函数前面的外部声明在整个文件范围中有效。

3、函数的递归调用

在调用一个函数的过程中又出现直接或者间接地调用函数本身,称为函数的递归调用。
C 语言的特点之一就在于允许函数的递归调用。

4、函数的嵌套调用

C 语言的函数定义是互相平行的、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义函数,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。
不仅要写出正确的程序,还要学习怎样使程序更加的精练、专业和易读。

猜你喜欢

转载自blog.csdn.net/lijiahao1212/article/details/129968126