调用交换函数修改值常遇到的问题以及解决方法

通常我们在遇到简单问题的解决时,不可避免的会出现大大小小的问题。
这里对于通过在A函数中调用B函数修改自己的值,需要通过传指针,解引用进行值的修改。
可能出现以下几个问题:

1:正常思维,直接进行值的交换。实参向形参传递参数,在B函数中交换值,但是A函数中实参的值并没有被修改。例如代码1。

2:通过传指针解决,没有进行解引用。定义一个临时整型指针,通过其间接交换两者的值,同1 A函数中值没有修改。例如代码2。

3:通过传指针,解引用。定义一个临时整型指针,通过其间接交换两者的值。这里程序崩溃。例如代码3。

程序问题分析:

//代码1
#include<stdio.h>
void Swap_error1(int a,int b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

在这里插入图片描述
如上图所示为该程序的说明图。A函数与B函数中,a,b两者的地址不同,如图值上方所示,b函数中交换两者的值并不修改A函数中a,b的值。该程序中形参改变并不会修改实参的值。无法修改。

//代码2(没有解引用)
#include<stdio.h>
void Swap_error2(int *p1,int *p2)
{
	int *tmp;
	tmp = p1;//交换地址
	p1 = p2;
	p2 = tmp;
}

在这里插入图片描述
通过A函数将a,b的地址传递给p1,p2,p1,p2保存a,b的地址,通过交换函数,p1,p2保存的地址发生改变,使p1指向b,p2指向a,但是并没有修改a,b的值。因此程序有误。

//代码3(野指针)
#include<stdio.h>
void Swap_error3(int *p1,int *p2)
{
	int *tmp; //野指针,悬挂指针
	*tmp = *p1;
	*p1 = *p2;
	*p2 = *tmp;
}

该程序中定义的临时整型指针,通过传指针,解引用,但是程序崩溃,系统提示警告tmp是一个未初始化的局部变量,这里tmp 为野指针(悬挂指针),不允许使用。是一个没有访问权限的指针,*tmp这个地址不能访问,不能将其他的内容放入其中。因此程序崩溃。

解决方法:

//代码4
#include<stdio.h>
void Swap(int *p1,int *p2)
{
	int tmp;
	tmp = *p1;//将*p1解引用的a的值给tmp;
	*p1 = *p2;//将*p2解引用的b的值给*p1解引用的a中
	*p2 = tmp;//将tmp 中的值给*p2解引用的b中
}

int main()
{
	int a = 10;
	int b = 20;
	Swap(&a,&b);//传地址
	printf("a=%d,b=%d\n",a,b);
	return 0;
}

在这里插入图片描述
定义一个临时的整形变量tmp,p1,p2保存a,b 的地址,此程序中,tmp 是一个整形变量,可以保存其他数值。通过*p1解引用将a的值给tmp,然后依次交换修改A函数中a,b的值。 在A函数(主函数)调用B函数(代码4)通过传指针,解引用修改值。

以上即为遇到的问题以及解决方法,有问题还请多多指教。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值