关于交换函数Swap的相关写法与错误示例

关于交换函数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; 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值