但是,如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,那么在函数中对数组元数进行修改实际上修改的是调用程序中的数组元素。函数将访问调用程序的数组元素,数组并不会被复制。这个行为被称作“传址调用”。
数组参数这种行为似乎与传值调用规则存在矛盾。但是,此处其实并无矛盾之处:数组名的值其实就是一个指针,传递给函数的就是这个指针的一份拷贝。下标引用实际上是间接访问的另一种形式,它可以对指针执行间接访问操作,访问指针指向的内存位置,参数实际上是一份拷贝,但在这份拷贝上执行间接访问操作所访问的是原先的数组。
所谓传址调用,就是通过传递一个指向所需元素的指针,然后在函数中对该指针执行间接访问操作操作实现对数据的访问。作为参数的数组名是个指针,下标引用实际执行的就是间接访问。
那么数组的传值调用行为表现在什么地方呢?传递给函数的是参数的一份拷贝(指向数组的起始位置的指针的拷贝),所以函数可以自由地操作它的指针形参,而不必担心会修改对应的作为实参的指针。
所以,所以的参数都是通过传值方式传递的。
很经典的交换两个整数的函数(没有效果)可以说明传值调用
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
这是没有效果的整数交换:因为它实际交换的是参数的拷贝,原先的参数值并没有进行交换。
如果要修改上面的程序,可以使用指针来实现:
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
因为要访问调用程序的值,我们必须向函数传递指向我们希望修改的变量的指针。接着函数必须对指针使用间接访问操作,修改需要修改的变量。
在主函数中,因为函数期望接受的参数是指针,所以我们应该按照下面的方式调用它:swap(&a,&b);