C语言函数被定义以后可以被多次调用,调用的时候可以向它传递参数。
函数的调用指的就是函数的使用方法。
在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下:
函数名(实参1, 实参2, …) //实参对应于函数定义时的形参声明
程序执行时,函数调用表达式将会被函数返回值所代替(见图 1)。函数的返回值一般由 return 语句指定。
程序运行中进行函数调用后,程序的流程会转到被调用的函数处,同时传递过来的实参的值被赋值给函数对应的形参(形参初始化),接着执行函数体语句,在遇到 return 语句,或者执行到函数体最后的大括号时,程序流程就会从该函数跳转到原来调用函数的位置(见图 2)。
#include <stdio.h>
#include <stdlib.h>
/*---自定义函数Max2:返回较大值---*/
int Max2 (int a, int b)
{
if(a>b)
return a;
else
return b;
}
/*---主函数---*/
int main( )
{
int n1,n2;
puts("请输入两个整数。\n");
printf("整数1:"); scanf("%d",&n1);
printf("整数2:"); scanf("%d",&n2);
printf("较大的值是%d \n",Max2(n1,n2)); //调用Max2函数
system("pause");
return 0;
}
运行结果为:
请输入两个整数。
整数1:66
整数2:47
较大的值是66
上面的代码清单 1 中,main( ) 函数通过 Max2(n1,n2) 调用自定义函数 Max2 时,实参变量 n1 的值被赋值给 Max2 的形参变量 a,实参变量 n2 的值被赋值给 Max2 的形参变量 b,此时,a 是 n1 的副本,两者具有相同的值,b 是 n2 的副本,两者具有相同的值。像这样通过值来进行参数传递的机制称为值传递。
由于函数间参数的传递是通过值传递进行的,所以,函数调用表达式中的实参可以是另一个有返回值的函数调用表达式(见图 3)。
自定义函数中,如果形参接收的是一个数组,则定义函数时要在形参声明中加上[ ]。而在函数调用表达式中的实参则直接使用数组名即可(见图 4)。
指向数组的形参声明格式如下:
类型名 形参名[ ] //形参名与指向的原数组名不同 //类型名与数组的数据类型相同
代码清单 2:使用函数(数组的传递)计算数学成绩和英语成绩的最高分
#include <stdio.h>
#include <stdlib.h>
#define NUMBER 5
/*--自定义函数:返回拥有n个元素的数组v中的最大值--*/
int Max_of(int v[],int n)
{
int i,max=0;
for(i=0;i<n;i++)
if(v[i]>max) max=v[i];
return max;
}
/*---主函数---*/
int main()
{
system("color 70");
int i,eng[NUMBER],math[NUMBER],max_e,max_m;
printf("请输入%d名学生的成绩。\n",NUMBER);
for(i=0;i<NUMBER;i++){
printf("[%d]英语:",i+1); scanf("%d",&eng[i]);
printf(" 数学:"); scanf("%d",&math[i]);
}
max_e=Max_of(eng,NUMBER); //调用Max_of函数
max_m=Max_of(math,NUMBER); //调用Max_of函数
printf("英语最高分=%d\n",max_e);
printf("数学最高分=%d\n",max_m);
system("pause");
return 0;
}
运行结果为:
请输入5名学生的成绩。
[1]英语:89
数学:78
[2]英语:77
数学:88
[3]英语:79
数学:83
[4]英语:71
数学:87
[5]英语:70
数学:96
英语最高分=89
数学最高分=96
图 5 展示了函数调用中数组的传递和变量值传递的区别。