3.4.5 修改外部对象
通常,向函数传递参数时,在函数内部生成该参数的一个拷贝。这称为按值传递(pass-by-value)。在下面的程序中能看到按值传递的效果:
在函数f()中,a是一个局部变量(local variable),它只有在调用函数f()期间存在。因为它是一个函数参数,所以调用函数时通过参数传递来初始化a的值;在main()中参数是x,其值为47,所以当调用函数f()时,这个值被拷贝到a中。
当运行这个程序时,我们会看到:
当然,最初,x的值是47。调用f()时,在函数调用期间为变量a分配临时空间,拷贝x的值给a来初始化它,这可以通过打印结果得到验证。当然,我们可以改变a的值并显示它被改变。但是f()调用结束时,分配给a的临时空间就消失了,我们可以看到,在a和x之间的曾经发生过的惟一联系,是在把x的值拷贝到a的时候。
当在函数f()内部时,变量x就是外部对象(outside object)(我用的术语)。显然,改变局部变量并不会影响外部变量,因为它们分别放在存储空间的不同位置。但是,如果我们的确想修改外部对象那又该怎么办呢?这时指针就该派上用场了。在某种意义上,指针是另一个变量的别名。所以如果我们不是传递一个普通的值而是传递一个指针给函数,实际上就是传递外部对象的别名,使函数能修改外部对象,例如:
现在函数f()把指针作为参数,并且在赋值期间间接引用这个指针,这就使得外部对象x被修改。这时的输出是:
注意,p中的值就是变量x的地址,指针p的确是指向变量x。如果这还不够令人信服,当改变指针p指向的变量值并间接引用赋值为5,我们看到变量x的值现在已经改变为5了。
因此,通过给函数传递指针可以允许函数修改外部对象。后面我们将看到指针有很多其他的用途,但是这是最基本的,可能也是最常用的用途。