通过Swap函数理解指针在函数传递中的各种问题

主函数

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

第一种错误:(不进行指针传递时)

子函数Swap中变量a和b仅仅只是赋值,main函数中的a和b是实参,Swap函数中的a和b是形参,它们不是同一个变量。

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

测试结果:
10,20

第二种错误:(交换形参的地址,但没有解引用)

这种情况只是交换了形参的地址,并未对形参指向的实参的值进行修改、

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

测试结果:
10,20

第三种错误 (传指针+解引用但出现了野指针)

野指针:
没有访问权限的地址(地址可能不存在也可能真实有效),指针没有初始化,越界或者已经没有访问权限

void Swap_err3(int *p1,int *p2)
{
	int *tmp;               //野指针,悬挂指针,tmp是个局部变量,默认值为随机值
	*tmp = *p1;             //解引用时*tmp崩溃,野指针不能访问 
	*p1 = *p2;
	*p2 = *tmp;
}

测试结果:
程序崩溃:int *tmp is not initialized
野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,所以程序在这里崩溃了。编程时要小心避免野指针。

正确引用方法

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

测试结果:
20,10

总结

一个函数的改变要想影响另一个函数,
必须满足两个条件:
1.传指针;2.解引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值