在调用函数时,大多数情况下,主调函数都需要将有关数据传递给被调函数。这就是有参函数。在定义函数时指定的用来接收从主调函数传递过来的值的变量称为形参变量,简称形参,在主调函数的调用函数表达式中,函数名后面圆括号中的每一个参数表达式为一个实际参数,简称实参。
总之,主调函数通过将实参表达式的值赋给被调函数的形参变量来完成从主调函数到被调函数的数据传送。被调函数通过 return 语句将被调函数运算的结果数据回传给主调函数。
#include<stdio.h>
float value(float x,float y)//形参为浮点型变量x、y
{
return x*y;//返回函数值x*y
}
int main()
{
float weight,price,je;
printf("请输入毛重量和单价:");
scanf("%f%f",&weight,&price);
je=value(weight-0.5,price);//实参分别为weight-0.5和price
printf("金额=%.2f元\n",je);
return 0;
}
注意:
- 实参是表达式,可以是常量、变量、函数值等任意类型的表达式的特殊形式。
- 形参变量的存储空间是在函数被调用时才分配的。函数调用结束是,形参所开辟的临时存储区也被释放。
- 值传递的特点是及时实参是变量,函数中对实参的操作也不会影响到主调函数中的实参变量,因为形参和实参是完全独立的。除了值传递,还有地址传递,地址传递中值的变化则会影响到主调函数中的值(因为他们使用的是同一个存储单元)。
#include<stdio.h>
void sort(int x,int y)
{
int z;
printf("第二次输出:x=%d,y=%d\n",x,y);
if(x>y)
{
z=x;
x=y;
y=z;
}
printf("第三次输出:x=%d,y=%d\n",x,y);
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("第一次输出:a=%d,b=%d\n",a,b);
sort(a,b);
printf("第四次输出:a=%d,b=%d\n",a,b);
return 0;
}
运行过程中,各变量的存储单元分配及其取值变化过程:
- a:声明了变量a,b,此时还未调用sort函数,因此只给a,b分配了存储单元
- 调用sort函数后,此时x和y分配存储单元,并将值传递给x和y,注意此时的存储单元是不同的,同时还给z分配存储单元
- 执行if语句后,满足a>b则x和y进行交换,但是a和b未进行交换
- 最后一次输出a和b的值与第一次相同