函数的调用方式
函数可以在main()函数中调用,也可以被其他函数调用。在调用函数时,要求实参与形参必须满足三个条件:个数相等、顺序对应、类型匹配。
根据函数在程序中出现的位置,其调用方式可以分为以下4种:
1、将函数作为表达式调用
将函数作为表达式调用时,函数的返回值参与表达式的运算,此时要求函数必须有返回值。示例代码如下:
int a=max(10,20);
此行代码中,函数max()为表达式的一部分,max()函数的返回值被赋给整型变量a。
2、将函数作为语句调用
函数以语句的形式出现时,可以将函数作为一条语句进行调用,示例代码如下:
printf("hello world!\n");
此行代码调用了输出函数printf(),此时不要求函数有返回值,只要求函数完成一定的功能。
3、将函数作为实参调用
将函数作为实参调用时,其实就是将函数返回值作为函数参数,此时要求函数必须有返回值。示例代码如下:
printf("%d\n",max(10,20));
此行代码将max()函数的返回值作为printf()函数的实参来使用。
4、函数嵌套调用
C语言中函数的定义是独立的,即不能在一个函数中定义另一个函数。但在调用函数时,可以在一个函数中调用另一个函数,这就是函数的嵌套调用。
下面通过一个案例演示函数的嵌套调用,具体如例1所示。
例1 nest.c
1 #include <stdio.h>
2 void printArr(int arr[]) //显示数组元素,函数参是int类型的数组名
3 {
4 int i;
5 for (i = 0; i < 10; i++)
6 {
7 printf("%3d", arr[i]);
8 }
9 }
10 void initArr() //数组元素填充
11 {
12 int arr[10], i;
13 for (i = 0; i < 10; i++)
14 {
15 arr[i] = i;
16 }
17 printArr(arr); //调用printArr()函数
18 }
19 int main()
20 {
21 initArr();
22 return 0;
23 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~9行代码定义了printArr()函数,用于打印数组元素;第10~18行代码定义了initArr()函数,用于初始化数组;在initArr()函数中,第17行代码调用了printArr()函数;在main()函数中,第21行代码调用了initArr()函数。main()函数调用了initArr()函数,initArr()函数调用了printArr()函数,这就是函数嵌套调用。
图1描述了例1中的函数嵌套调用过程。
图1展示了程序中含有3层函数调用嵌套的情形,总共分为5个步骤,具体如下:
① 程序执行main()函数开头部分,遇到函数调用语句,调用initArr()函数,流程转向initArr()函数入口。
② 在initArr()函数体中遇到printArr()函数的调用,流程转向printArr ()函数入口。
③ printArr()函数调用完毕回到initArr()函数调用点。
④ initArr()函数调用完毕,跳转至main()函数部分。
继续执行main()函数的剩余部分,直到程序执行结束。