函数数据传递
一、形式参数和实际参数间的数据传递
形参出现在被调函数当中,在整个函数体内都可以使用。形参在定义时编译系统并不分配存储空间,只有在调用该函数时才分配内存单元。调用结束内存单元被释放,故形参只有在函数调用时有效,调用结束时不能再使用。
实参出现在主调函数当中,当函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现函数间的数据传递。传递方式有两种:值传递和地址传递方式。
在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个zhi。该值在函数调用期间有效,可以参加该函数中的运算。
在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合”。
例:输入两个整数,要求输出其中值较大者。要求用函数来找到大数。
程序:
(1)先编写max函数:
int max(int x,int y) //定义max函数,有两个参数
{
int z; //定义临时变量z
z=x>y?x:y; //把xy中的大者赋给z
return(z) //把z作为max函数的值带回main函数
}
(2)再编写主函数
#include<stdio.h>
int main()
{
int max(int x,int y); //对max函数的声明
int a,b,c;
printf(“please enter two integernumbers:”);
scanf(“%d,%d”&a,&b); //输入两个整数
c=max(a,b); //调用max函数,有两个实参。大数赋给变量c
printf(“max is%d\n”,c); //输出大数c
return 0;
}
把二者组合为一个程序文件,主函数在前面,max函数在下面。
程序分析:先定义nax函数(第一行末尾没有分号),第一行定义了一个函数名max,函数类型为int,指定两个形参x和y,形参的类型为int。
主函数包含了一个函数调用max(a,b)。max后面括号内的ab是实参。a和b在main函数中定义的变量,x和y是函数max的形式参数。通过函数调用,在两个函数之间发生数据传递,实参a和b的值传递给形参x和y,在max函数中把x和y中的大者赋给变量z,z的值作为函数返回main函数,赋给变量c。
当形参定义为变量时,实参可以是常量、变量和表达式,这种函数间的参数传递为值传递方式。值传递的特点是参数的“单向传递”;只能由实参传给形参,而不能由形参传给实参。
二、数组元素作为函数参数
数组元素又称为下标变量,它具有普通变量的一切性质,因此数组元素作为函数的实参进行数据传递是与普通变量没有任何区别,也是值传递。
三、地址传递方式
地址传递方式也是在形式参数和实际参数之间传递数据的一种方式。
地址传递方式所传递的是地址。调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。由于形式参数和实际参数地址相同,即它们占用相同的内存。所以调用时,可以看成将实际参数的值传递给形式参数:返回时,可以看成将形式参数的值回带给对应的实际参数。其特点是“参数值的双向传递”。
由此可知,采用地址传递方式的实际参数只能是变量的地址、数组名(数组首地址)或指针变量等,而接受地址值的形式参数也只能是指针变量或数组名。
例:交换两个变量的值。
swap (int *x1, int *x2)
{int temp;temp=*x1; *x1= *x2; *x2= temp;}
main()
{int a, b;
int *p1, *p2;
scanf (“a=%d, b=%d”, &a, &b );
p1=&a; p2=&b;
swap (p1,p2);
printf (“a=%d, b=%d\n”, a, b);}
运行结果为
a=12, b=23
a=23, b=12
在此程序中实参指针变量p1、p2将变量a,b的地址传递给swap函数的形参指针变量x1、
x2在swap函数中通过temp变量交换x1、x2所指向存储单元即a、b变量的值实现交换变量a、b值的目的。
四、全局变量传递方式
全局变量是指在函数之外定义的变量。如果在函数之外定义了全局变量则该变量的作用域从变量的定义位置开始到本源程序文件结束在其作用域中任何函数均可以使用全局变量。在全局变量的作用域中如某一函数改变了全局变量的值则在其后使用的是改变后的全局变量的值。由于全局变量定义后其作用域中的函数都可使用它从而也可以实现函数间数据的传递。在这种传递方式中利用的是系统分配给全局变量的内存单元即全局变量的内存单元地址不变其实也是一种地址传递。
五、返回值方式
返回值方式不是在形式参数和实际参数之间传递数据,而是通过函数调用后直接返回一个值到主调函数中。因此这种方式通常适用于从被调函数中将一个值传回主调函数。
利用返回值的方式传递数据,在定义函数时,必须要注意下列两点:
(1)函数头中要有“数据类型说明符”,说明该函数返回值的数据类型。
(2)函数体中应有“return(表达式);”语句,其中表达式值就是函数返回值。