[c语言]swap函数 和 指针的引入

很多萌新在刚开始学习编程的时候都会遇到交换数字的问题,当时我们的做法就是创建一个临时变量,然后将其中一个的值赋予这个变量用于临时保存。就像下图:

int temp = a;
	a = b;
	b = temp;

但是这仅仅只在main函数中可以这样子转换,当我们想要写一个实现数字转换的函数并且引用时,我们就会发现上面那种方式不能够实现了。

第一种方法

#include<stdio.h>
void swap1(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}
void main()
{
	int a = 10;
	int b = 20;
	printf("a = %d , b = %d\n", a, b);
	swap1(a, b);
	printf("a = %d , b = %d", a, b);

}

 我们发现同样的代码在函数中无法实现我们的需求。

 原因是:这里涉及一个知识点就是实参和形参,在主函数中的参数是实参,而在创建的函数中的参数是形参,在函数中我们创建了两个形参a,b(名字相同),仅仅只是对形参a与b进行了交换,而在主函数的实参a,b没有受到任何影响,所以无法实现通过函数转换数字的需求。

至此我们引入一个指针的概念,指针指向的是一个元素的存放地址,我们可以通过将指针设置为函数的传入参数,由此来实现对数字的转换。

第二种方法

void swap2(int* a, int* b)
{
	int* temp = a;
	a = b;
	b = temp;
}
}
void main()
{
	int a = 10;
	int b = 20;
	printf("a = %d , b = %d\n", a, b);
	
	swap2(&a, &b);
	
	printf("a = %d , b = %d", a, b);

}

 然而我们又会发现似乎我们使用了指针,但还是结果与我们想象的有所偏差,这是为什么呢?

原因是:看似我们引入了指针,但是在函数中我也只是开辟了名为a和b的形参指针变量(名字一样),然后我们再通过赋值的方式,将实参a和b的值赋给了形参a和b,因此后续的转换值的操作都是针对于形参a和b进行的,对实参没有任何影响,这就是为什么我们执行完后还是没能将数字进行转换。

于是我们可以换一种方法

第三种方法

void swap3(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
void main()
{
	int a = 10;
	int b = 20;
	printf("a = %d , b = %d\n", a, b);
	//swap1(a, b);
	//swap2(&a, &b);
	swap3(&a, &b);
	printf("a = %d , b = %d", a, b);

}

我们发现这种方法能够满足我们的需求,可以通过函数将两个数转换一下值。

原因是:此方法虽然也使用了形参指针变量,同上一个方法一样,但是将实参的值赋给形参之后,此时实参和形参的值均是指向a和b的地址,这个时候使用*操作符,通过指向的地址来找到指向地址的值(此方法可以忽略实参和形参的区别,因为无论是实参还是形参指向的地址都是一样的,所以这个时候通过地址去改变值是可以实现我们的需求的),找到对应的值后进行转换操作此时能够实现通过函数转换数字的需求。

以上就是我对swap函数例子的一些总结,若大家还有上什么疑问可以在评论区留言,我会及时回复。以及若对本人的文章有什么建议也可以留言或者私信,谢谢大家~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值