在了解什么是函数的基础之上,我们需要进一步学习,如何利用函数调用来使得我们的程序更加简洁、高效。那么,函数的参数与调用则是尤为重要的知识。
1 函数的参数
在大多数情况下,函数是有参数的,这也就意味着,当需要利用函数完成一个功能时,我们需要给出完成该功能的必要条件。例如在【例6-3】中,求取两个整数的最大值,对于这一功能,我们必须给出这两个整数作为参数传递给max函数。
函数的参数分为两类:形式参数和实际参数。形式参数是指在定义函数时,函数名后面括号中的变量名称,而实际参数是指在函数调用的时候,函数名后括号中的变量名称。
函数的形参表由一些了用逗号分隔的参数类型和参数名组成,如果两个参数具有相同的类型,其类型必须重复声明,如:求出两个整数的最大数的函数的声明。
int max(int v1,int v2); //max函数的声明
int max(int v1,v2); //错误
参数表中不能出现同名的参数,类似的,函数的局部变量也不能使用与函数参数相同的变量名。
调用函数时,对于每一个实参,其类型都必须与对应的形参类型相同,或者可以被转换为盖形参的类型。例如,对于【例6-1】中具有两个int类型形参的gcd函数来说:
【例6-4】函数的参数匹配
int main ()
{
gcd(“hello”,”world”); //错误,参数类型不匹配
gcd(985); //错误,参数个数不匹配
gcd(3.14, 1.55); //正确,double类型常量可被转为int类型
gcd(5,4+7); //正确
}
第一个调用时不合法的,因为字符串类型无法转变为整数类型;第二个调用也是不合法的,因为实参的个数必须与形参表相一致;第三个调用是合法的,当发生调用时,3.14将转为int类型,并将值传递给v1,1.55将转为int类型,并将值传递给v2;第四个调用也是合法的,实参可以是表达式。
有关形参和实参的说明:
(1)在定义函数时指定的形参,在未出现函数调用时,它们并不占用内存中的存储空间,因此称之为形式参数或虚拟参数,表示它们并不是实际存在的数据。只有当发生函数调用时,函数的形参才被分配内存单元,以便接收从实参传来的数据。在函数调用结束后,形参所占的内存单元也被释放。
(2)实参可以是常量、变量、表达式,但要求表达式有确定的值。
(3)在定义函数时,必须在函数首部指定形参的类型。
(4)形参和实参的类型必须相一致或者能够相互转化。
(5)实参的值传递给形参的时候是单向传递,只由实参传递给形参,而不传回。即:在被调用函数中,对于形参值的改变,并不会影响到实参的值,这一点尤其要注意。
【例6-5】函数的参数传递
/*交换两个整数*/
#include<iostream.h>
void exchange(int v1,int v2); //max函数的声明
int main()
{
int a=100,b=200;
exchange(a,b); //将a, b中最大的数赋值给c
cout<<a<<","<<b;
return 0;
}
void exchange(int v1,int v2)
{
int temp=v1;
v1=v2;
v2=temp;
cout<<v1<<","<<v2<<endl;
}
程序运行结果:
200,100
100,200
在exchange函数中,交换了v1和v2的值,但对于main函数中a和b的值并没有影响,也就是说,实参到形参的值是单向传递的。
【例6-6】输入三个整数x,y,z,请把这三个数由小到大输出。
int sort(intx,inty,int z)
{
intt;
if (x>y)
{
t=x;
x=y;
y=t;
} /*交换x,y的值*/
if(x>z)
{
t=z;
z=x;
x=t;
}/*交换x,z的值*/
if(y>z)
{
t=y;
y=z;
z=t;
}/*交换z,y的值*/
cout<<"small to big:”<<x<<”,”<<y<<”,”<<z<<endl;
}