Swap函数的写法及其常见错误示例
数据交换在编程过程中十分常见,为方便起见,我们可以编写一个函数Swap,用于两个变量之间的数据交换,需要交换两个变量的值调用函数Swap即可。但在编写Swap函数的过程中,容易出现一些常见错误,下面便给出正确的写法及其常见错误示例。
错误示例1:
void Swap(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
上面写法的错误点在于没有使用指针,被调用函数(子函数)中的同名变量值无法传递到主调函数(父函数)中;不同函数中的同名变量虽然变量名一样,但他们的地址并不相同,这就导致被调用函数中的两个变量交换了,而主调函数中的变量并未发生交换。该错误类似于定义在for循环里的循环变量i无法传递到当前函数。
类似错误示例:
#include <stdio.h>
int main()
{
int i=0;
for(int i=0;i<2;i++)
{
;
}
printf("%d\n",i);
}
错误示例2:
void Swap(int *p1,int *p2)
{
int *tmp;
tmp=p1;
p1=p2;
p2=tmp;
}
该写法错误点在于没有出现解引用,虽然两个变量的地址发生了交换,但是他们的数值并未发生交换。假设要交换的变量是a和b,原先指向a的指针是p1,指向b的指针是p2;两个指针交换后指向a的指针是p2,指向b的是p1;就相当于交换了变量a和变量b的地址,a和b的值并没有交换。
错误示例3:
void Swap(int *p1,int *p2)
{
int *tmp;
*tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
改写法错误是出现了野指针,即指针*tmp没有初始化,他没有指向的变量,计算机没有访问地址的权限,这个地址可能存在,也可能不存在。就好比定义了一个整型变量a,在没有给a赋值的情况下输出a,也会出现类似的错误报告。该写法可修改为在定义一个整型变量x,把x的地址赋值给tmp即可完成交换。修改后的代码如下:
void Swap(int *p1,int *p2)
{
int *tmp;
int x;
tmp=&x;
*tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
正确写法示例:
#include <stdio.h>
void Swap(int *p1,int *p2)
{
int tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
int main()
{
int a=10;
int b=20;
Swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}