C语言的所有参数均以“传值调用”方式传递,这意味着函数将获得参数值的一份拷贝。这样,函数就可以放心的修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数。
先看一个例子程序:
/** Exchange two integers int the calling program (doesn't work !) **/
void swap( int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
return;
}
分析: 当然,这个程序是无效的,程序的本意是希望修改调用程序传递的参数。 这个函数的目的是交换调用程序所传递的这两个参数的值。但是这个程序是无效的,因为它实际上交换的是参数的拷贝,原先的参数值并未进行交换。
其实,C的规则很简单: 所有参数都是传值调用,即所有的调用程序都是获得传递参数的一份拷贝。但是,如果被传递的参数是一个数组名,并且在被调用函数中使用下标引用该数组的参数,那么在该函数中对数组元素进行修改实际上修改的是调用程序中的数组元素(即该数组本身的元素发生了改变)。函数访问调用程序的数组元素,数组并不会被复制。这个行为被称为“传址调用”。
数组参数的这种行为似乎与传值调用规则相悖。但是,此处实际上并无矛盾之处--数组名的值实际上是一个指针,传递给函数的就是这个指针的一份拷贝。下标引用实际上是间接访问的另外一种形式,它可以对指针进行间接访问操作,访问指针指向的内存位置。参数(指针)实际上是一份拷贝,相当于申明另外一个指针变量,只不过这个指针是指向原先的数组。因此把上面那个程序改造成:
/** Exchange two integers int the calling program **/
void swap( int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
return;
}
注:源文来自http://hi.baidu.com/liuhuman/blog/item/adf3dbfc8bd2a6fafd037f60.html