1
C语言程序设计
1.7.2.2 6.2.2 传址调用

6.2.2 传址调用

所谓传址调用是函数调用时,将实参数据的存储地址作为参数传递给形参。其特点是形参与实参占用同样的内存单元,函数中对形参值的改变也会改变实参的值,因此可实现主调函数与被调函数之间双向的数据传递。注意,形参与实参都必须是地址变量。比较典型的传址调用方式是用数组名作为函数的参数,在下一节“函数与数组”中我们将仔细讨论,下面先看一个简单的例子。

假设程序里常要交换两个整型变量的值,我们想为此写函数swap,希望调用swap 能交换两个变量的值。由于操作中需要改变两个变量,显然不能靠返回值(返回值只有一个)。不仔细考虑也可能认为这个问题很简单,有人可能写出下面函数定义:

img513

写一段程序定义变量并实际调用这个函数,例如,写出如下程序段:

  int m=1,n=2;

  swap(m,n);

执行后会发现变量m和n的值没有变。上述程序失败的原因在于C 语言的参数机制:调用swap 时m和n的值送给形参a和b,虽然函数里面交换了a和b的值,但不会影响实参m和n,调用结束时局部变量a和b被撤销,m和n的值没有变。要真正实现数据的交换,可以采用传址调用方法。

例6-6 交换两个整型变量的值。

img514

在这个例子里,函数swap()被调用时,传递给函数swap()的形参指针a和b的是实参m和n的存储地址,因此,在函数swap()被调用中形参指针a指向的目标变量为实参m,形参指针b指向的目标变量为实参n,因此在swap()函数中*a和*b的交换,实质上就是指针a和b指向的目标变量m和n的交换。可见,swap()函数实现了两个数据的交换。

要在函数中交换实参数的值,只能传地址,并交换形参指针所指向的值。如果仅仅交换实参指针的指向,是不能交换两个变量的值的,如例6-7所示。

例6-7 交换两个整型变量的值,失败。

img515

img516

在这个例子里,函数swap()被调用时,传递给函数swap()的形参是存储地址,虽然在函数swap()中交换了形参的地址值(指针的指向),但当函数调用结束并返回到主函数中时,实参仍然存在、有效,不受形参地址改变的影响,它们各自对应的内存单元仍不变,因此,swap()函数不能实现两个数据的交换。

性能提示

img517 传址调用对性能很有帮助,因为它可以减小按值传递复制大量数据的开销,提高程序执行效率。

常见的编程错误6.2

img518 在传址调用时,来传送实参的地址。

img519 在传址调用时,函数的形参未定义为指针变量。

常见的编程错误6.3

img520 在传址调用的函数中,未用“*”运算符访问形参指针指向的目标变量(实参变量)。