8.5.1 形参为指针变量时实参和形参之间的数据传递
若函数的形参为指针类型,调用该函数时,对应的实参必须是基类型相同的地址值或者是已指向某个存储单元的指针变量。
例8.2? 编写函数myadd(int*a,int*b),函数中把指针a和b所指的存储单元中的两个值相加,然后将和值作为函数值返回。在主函数中输入两个数给变量,把变量地址作为实参,传送给对应形参。

在此程序中,主函数调用myadd函数时,系统为myadd 函数的形参 a和 b开辟两个基类型为 int类型的临时指针变量,并通过实参 &x、&y 把x 和y 的地址传送给它们,参数之间的关系如图8.7所示,这时,指针a指向变量x,指针b指向变量y。然后程序的流程转去执行myadd函数。
在myadd函数中,语句sum=牢a+*b;的含义是:分别取指针a和b所指存储单元中的内容,相加后存入变量sum中,实际上就是把主函数中x变量和y变量中的值相加存入变量sum中了。所以,myadd函数返回的是主函数中x变量和y变量中值的和。www.examzz.com
由此程序可见。通过传送地址值,可以在被调用函数中对调用函数中的变量进行引用。
8.5.2 通过传送地址值在被调用函数中直接改变调用函数中的变量的值
到目前为止,我们已经知道形参值的改变并不能改变对应实参的值,把数据从被调用函数返回到调用函数的唯一途径是通过return语句返回函数值,这就限定了只能返回一个数据。但是在例8.2中通过传送地址值,可以在被调用函数中对调用函数中的变量进行引用,这也就使得通过形参改变对应实参的值有了可能,利用此形式就可以把两个或两个以上的数据从被调用函数返回到调用函数。下面以传送地址的方式重写第7章中例7.3的swap函数。
例8.3调用swap函数,交换主函数中变量x和y中的数据。#include <stdi0.h>
void swap(int*,int*);main()
{ int x=30,Y=20;
printf(”(1)x=%d y=%d\n”,x,Y);swap(&x,&y);
printf(”(4)x=%d y=%din”,x,Y);
}
void swap(int*a,int *b)
{ int t;
printf(”(2)a=%d b=%d\n”,*a,*b);
t=*a; *a=*b; *b=t:
printf(”(3)a=%d b=%d\n”,*a,*b);
}
程序运行结果如下:
(1) x=30 y=20f2)a=30 b=20(3)a=20 b=30(4)X=20 y=30由于没有通过return语句返回函数值,所以定义SWaP函数为void类型。由此例子可见.C程序中可以通过传送地址的方式在被调用函数中直接改变调用函数中的变量的值,从而达到函数之间数据的传递。