址传递
在函数调用过程中,并非所有传入函数的参数都不需要改变,但是仅仅依靠值传递,无法实现在函数内部更改函数参数。为此,可以通过传递地址,使形参和实参都指向主调函数中数据所在的内存,从而使被调函数可以对调用函数中的数据进行更改操作。
与值传递不同,地址传递的是变量的地址,函数形式参数与实际参数指向同一块内存地址,即都指向实际参数所在的内存空间。在函数中通过地址修改变量的值,就是修改实际参数的值。下面修改例7-6,将func()函数的形参类型修改为int*类型,再次在main()函数中调用,具体如例1所示。
例1 addr.c
1 #include <stdio.h>
2 void func(int* a,int* b ) //参数类型为int*类型
3 {
4 int temp;
5 temp = *a; //通过指针修改变量的值
6 *a = *b;
7 *b = temp;
8 printf("*a=%d *b=%d\n", *a, *b); //输出交换之后的数据
9 }
10 int main()
11 {
12 int x = 10, y = 20;
13 func(&x, &y); //调用func()函数,传递变量地址
14 printf("x=%d y=%d\n", x, y); //输出main()函数中的变量
15 return 0;
16 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~9行代码定义了func()函数,它有两个int*类型的形式参数,在func()函数内部,交换指针a和指针b指向的内存空间的数据;第13行代码,在main()函数中调用func()函数,并将变量x、y的地址传递给func()函数;第14行代码输出变量x、y的值。由图7-10可知,指针a和指针b指向的数据交换成功,变量x、y的数据也进行了交换。
址传递过程相当于定义一个指向变量的指针,通过指针操作变量,变量的值就会发生改变。图1描述了例1中址传递的过程。
图1 址传递过程