关于交换函数Swap的相关写法与错误示例
数据的交换在程序中比较常见,为方便起见,我们可以直接将其编写成一个交换函数Swap,在后续编写需要时直接调用,将两个数据的值进行交换。但需要注意的是,子函数想要影响父函数的数据,必须传指针和解引用;否则容易出现错误。
正确代码:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
错误示例1:
void Swap_err1(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
上面的代码错误点在于没有使用指针,子函数的变量值无法真正传递到主函数中。两者的地址不同,导致子函数中的变量交换只是子函数内进行交换,无法传递到主函数中去。子函数中的变量在子函数运行就重新定义,即使与主函数中的变量名相同,地址也不相同。
此类错误和for循环情况相识:
#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;
}
该写法错误点在于没有出现解引用,它定义了一个整形指针tmp对p1,p2进行交换,导致交换的只是地址,并没有对数进行交换。
假设p1指向a(p1=&a),p2指向b(p2=&b),
则这一步操作其实是让原本指向a变量的p1指向b,让原本指向b变量的p2指向a,但并没有改变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;
}