学科分类
目录
C语言

址传递

在函数调用过程中,并非所有传入函数的参数都不需要改变,但是仅仅依靠值传递,无法实现在函数内部更改函数参数。为此,可以通过传递地址,使形参和实参都指向主调函数中数据所在的内存,从而使被调函数可以对调用函数中的数据进行更改操作。

与值传递不同,地址传递的是变量的地址,函数形式参数与实际参数指向同一块内存地址,即都指向实际参数所在的内存空间。在函数中通过地址修改变量的值,就是修改实际参数的值。下面修改例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 址传递过程

点击此处
隐藏目录