今天同学给了我一道题的代码,说他自己找了半天错误也没有AC那道题,让我给看看。拿到代码看了一下,发现一个很严重的误区,专门写出来说一下。全部代码我就不贴了,我只是就那个误区构造了一段错误的代码。
#include
void swap(int x,int y)//这是错误的写法
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=5,b=8;
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
代码很容易理解,就是交换2个变量a和b的值并输出,但是运行后我们发现输出结果不是"8 5"而依旧是"5
8",也就是说交换函数并没有将2个变量的值交换,这是为什么呢?
我们知道,C语言中整型变量的形式参数传递的是值而不是地址,也就是形式参数实际上是复制了实际参数的值进入函数运算的,而被复制的实际参数的值并没有改变。就这段代码来说,就是形参x复制了a的值变成5,形参y复制了b的值变成8,然后在swap函数中进行交换,使得x=8,y=5,但实际上a和b的值并没有被交换,这也就是为什么这段代码并没有实现交换的原因。
那么怎么解决呢?
先前我们说了C语言中整型变量的形式参数传递的是值而不是地址,那么现在我们就让它传递地址,直接交换实际参数的值。
#include
void swap(int *x,int
*y)//使用指针传递地址
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a=5,b=8;
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
我们使用指针变量来进行地址传递,形式参数为变量a和b的地址,swap函数直接交换a和b的地址所指向的值。这里一定注意形式参数传递的是地址而不是值。