从交换两数据值看指针的使用(c语言实现)


一、交换两数据值的错误做法

错误一:

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}
int main()
{
	int x=1;
	int y=2;
	swap(x,y);
}

错误原因:
在这里插入图片描述主函数调用swap函数时,swap函数会分配a,b两个空间来存储主函数的参数,swap函数执行完后
swap中分配的栈空间中a,b两个值交换了。但是当swap函数执行完返回主函数时,a,b两个变量被释放,而主函数中的x,y并么有改变。
错误二:

void swap(int* a, int* b)
{
	int* temp = a;
	a = b;
	b = temp;
}
int main()
{
	int x=1;
	int y=2;
	swap(&x,&y);
}

错误原因:
在这里插入图片描述转函数调用swap函数时,swap函数分配两个指针变量a,b来存储x,y的地址,swap函数运行后,交换的是两个指针变量的地址,a指向y,b指向x,在swap函数返回主函数后,a,b两个指针变量被释放,主函数的x,y仍然没有被改变。

二、交换两变量值得正确做法

交换常量值:

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	int x=1;
	int y=2;
	swap(&x,&y);
}

在这里插入图片描述主函数调用swap函数时,swap函数分配两个指针变量a,b分别指向x,y,swap函数通过*p直接访问指针所指向的值,并将他们交换,当swap函数返回主函数后a,b两个指针变量被释放,但是他们指向的x,y被改变了。

交换指针变量值:

void swap(int** c, int** d)
{
	int* temp = *c;
	*c = *d;
	*d = temp;
}
int main()
{
	int x = 1;
	int y = 2;
	int* a = &x;
	int* b = &y;
	swap(&a, &b);
}

在这里插入图片描述主函数调用swap函数时,swap函数中分配两个指针变量c,d分别指向主函数中的指针变量a,b,执行swap函数时,通过c,d两个指针变量来操作a,b两个指针变量,达到交换两个指针变量的目的。只会改变指针变量a,b中存储的地址,不会改变常量x,y的值。

void swap(int* c, int* d)
{
	int  temp = *c;
	*c = *d;
	*d = temp;
}
int main()
{
	int x = 1;
	int y = 2;
	int* a = &x;
	int* b = &y;
	swap(a, b);
}

在这里插入图片描述
主函数调用swap函数时,分配两个指针变量c,d来存储指针变量a,b的值,也就是c,d直接指向变量值,通过*P来交换变量值,所以最后变量x,y会改变,而a,b中存储的地址不会改变。

总结

子函数要对主函数的变量进行操作,子函数中的传入参数要为主函数变量的地址,如主函数为普通变量,则传入参数要为指针,如主函数为指针变量,传入参数要为二级指针,依次内推。然后子函数中通过该指针来改变主函数的变量的值,不要再子函数中直接操作指针,而要通过*p来操作指向的变量。最后一种情况与交换常量值相似,都是改变常量的值,而不会改变主函数指向常量的指针。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值