交换函数的一二三事

本文通过示例分析了在C语言中如何正确交换两个变量的值,讲解了值传递与指针传递的区别。重点讨论了使用指针作为参数时,如何通过解引用来实现变量值的交换,避免了野指针的问题。最后总结了函数修改外部变量值的必要条件:传指针和解引用。
摘要由CSDN通过智能技术生成

在main函数中,对两个值进行交换,要再定义一个变量作为媒介。

int main()
{
    int a = 10;
    int b = 20;
    int tmp = a;
	a = b;
	b = tmp;
    
    printf("%d,%d\n",a,b);
    return 0;
}

若是将这段交换代码提出到一个新的函数中,他就不能实现a和b的交换了,结果如下:

void Swap_err1(int a,int b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap_err1(a,b);
	printf("%d,%d\n",a,b);

	return 0;
}

进行调试并监控a和b的地址会发现,此时在main函数中a的地址fc8c(取后四位,下同),b的地址fc80,进入Swap函数中a的地址变成了fb9c,b的地址变成了fba0,值没变,由此可以知道,这只是进行了一个值传递,没有实质改变。

要对ab改变还是要传指针。接下来修改代码,传指针进去。

void Swap_err2(int *p1,int *p2)
{
	int *tmp = p1;
	p1 = p2;
	p2 = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap_err2(&a,&b);
	printf("%d,%d\n",a,b);

	return 0;
}

再进行调试,继续监视ab地址变化,可以看到这时两个函数中的ab地址一致。

此时p1指向a,p2指向b,进行接下来的交换步骤,交换的是p1和p2里的内容,也就是交换了地址,ab依旧是没有改变。

要改变ab里的值还需要对p1和p2解引用。再次修改代码。

void Swap_err3(int *p1,int *p2)
{
	int *tmp;
	*tmp = *p1;
	*p1 = *p2;
	*p2 = *tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap_err3(&a,&b);
	printf("%d,%d\n",a,b);

	return 0;
}

这时运行会发现程序崩溃了,系统给出的原因是指针tmp未初始化。这种未初始化的指针称为野指针,也叫悬挂指针,这是一个没有访问权限的地址。

 解引用不能这样用,换一种方法。

void Swap(int *p1,int *p2)
{
	int 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;
}

调试进行监控。

交换代码中*p1=a=10,*p2=b=20,交换就是对值的交换,不再是地址。

运行成功。

总结: 一个函数想要修改另一个函数的变量值,必须传指针解引用。(也要注意野指针的存在)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值