c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。
但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。
因此,使用swap函数进行数据交换时,必须保证两点:
1.
参数必须是指针类型,指向待交换的数据
2.
交换时,必须交换地址中的数据,而不是交换地址本身。
参考代码:
//错误的交换代码1
void swap1( int a, int b ) //参数不是待交换数据的指针
{
int t=a;
a=b;
b=t;
}
//错误的交换代码2
void swap2( int *a, int *b )
{
int *t=a;//交换形参变量本身
a=b;
b=t;
}
//正确的交换代码
void swap( int *a, int *b )
{
int t=*a;//交换形参变量地址中的数据,指针变量不变
*a=*b;
*b=t;
}
在函数调用过程中分两种:按值传递与按地址传递(指针函数)。
按值传递,形参的改变不会影响实参
按地址传递,形参的改变当然可以改变实参的值。