浅谈C/C++中交换数值的函数方法

浅谈C/C++中交换数值的函数方法

学习C++的过程中遇到过很多坑,其中有一个坑就是交换变量的值。通过网上的学习,总结出来几个常用的方法。
1.不封装函数,直接在main函数中实现交换。

#include <iostream>
using namespace std;
int main()
{
	int a=1,b=2,c;
	c=a;
	a=b;
	b=c;
	cout<<a<<" "<<b<<endl;
	return 0;
}

输出结果:

2 1

2.申请全局变量,通过封装函数实现交换,没有形参。

#include <iostream>
using namespace std;
int a=1,b=2,c;
int swap();//函数声明
int main()
{
	swap();
	cout<<a<<" "<<b<<endl;
	return 0;
}
int swap()
{
	c=a;
	a=b;
	b=c;
	return 0;
}

输出结果:

2 1

在这里,由于申请的是全局变量,所以在swap函数执行完的时候并没有释放变量a和变量b的内存。

3.申请局部变量,在封装函数添加引用来实现交换。

#include <iostream>
using namespace std;
int swap(int &,int &);//函数声明
int main()
{
	int a=1,b=2;
	swap(a,b);
	cout<<a<<" "<<b<<endl;
	return 0;
}
int swap(int &m,int &n)
{
	int temp;
	temp=m;
	m=n;
	n=temp;
	return 0;
}

输出结果:

2 1

这里的&a,&b不是取地址的意思,是引用,即用m来代替整型变量a,相当于给整型变量a取了一个别名m;用n来代替整型变量b,相当于给整型变量b取了一个别名n。在函数swap执行完时并不会释放变量a和b的内存,所以能够实现数值交换。

***4.申请局部变量,在封装函数添加整型形参来实现交换。***

#include <iostream>
using namespace std;
int swap(int ,int );//函数声明
int main()
{
	int a=1,b=2;
	swap(a,b);
	cout<<a<<" "<<b<<endl;
	return 0;
}
int swap(int m,int n)
{
	int swap;
	swap=m;
	m=n;
	n=swap;
	return 0;
}

输出结果:

1 2

注意:这个做法的结果是不成功的,原理看似没问题,但仔细分析发现,变量m和变量n是局部变量,而在调用swap函数时,实际上是把整型变量a和b的值传给形式参数m和n,而swap函数执行完后,局部变量m和n都会被释放掉内存。实际上变量a和变量b并没有做到数值交换。这也是实现这个功能函数时最大的坑。改进的方法是用引用的方法。

5.在封装函数添加指针形参来实现交换。

#include <iostream>
using namespace std;
int swap(int *,int *);//必须声明,不然会报错
int main()
{
	int a=1,b=2;
	swap(&a,&b);
	cout<<a<<" "<<b<<endl;
	return 0;
}
int swap(int *m,int *n)
{
	int temp;
	temp=*m;
	*m=*n;
	*n=temp;
	return 0;
}

输出结果:

2 1

这个函数实现变量之间数值交换,采用的是通过变量的地址去访问变量的值,变量的地址在局部函数执行完以后不会被释放。

6.不采用中间变量的方式。

#include <iostream>
using namespace std;
int swap(int &,int &)
int main()
{
	int a=1,b=2;
	swap(a,b);
	cout<<a<<" "<<b<<endl;
	return 0;
}
int swap(int &a,int &b)
{
	a=a+b;
	b=a-b;
	a=a-b;
	return 0;
}

输出结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值