C语言函数参数的传递方式有传地址方式和传值方式(c++还有引用传值)。
值传递,就是把你的变量的值传递给函数的形参,实际就是用变量的值来新生成一个形参,因而在函数里对形参的改变不会影响到函数外的变量的值。
地址传递,就是传变量的地址赋给函数里形参指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。
请看下面两个例子
eg.1 void swap1 (int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}//函数的作用是交换两个参数的值
当我们调用这个函数时,发现并不会交换参数的值。原因是什么呢?就是因为函数的传值方式并不会改变实参的值。
eg.2 void swap2(int * x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
这个函数就可以实现两个参数的交换。
明白了以上内容,再看一个实例
eg.3 void swap3(int * x,int * y)
{
int * temp;
temp=x;
x=y;
y=temp;
}
函数的执行结果是什么呢?结果竟然并没有实现两个参数的交换。不是说函数的传地址方式能改变实参的值嘛,指针不就是地址嘛,为什么没有改变实参的值呢。其实不然,指针型也是一种数据类型,也占用内存地址,只不过内存中的内容是所指向的类型的地址。所以,在swap3 这个函数中,参数的传递方式是值传递。
为了便于理解,可以修改eg.3
eg.3_1
typedef int * INT_P;
void swap3(INT_P x,INT_P y)
{
INT-P temp;
temp=x;
x=y;
y=temp;
}
这样就和eg.1是一样的。记住,不要看到指针就以为是地址传递,应该视具体情况而定!