关于数据交换的测试分析

关于数据交换的测试分析

本人在经过多次学校的考试题目折磨后,终于下定决心对数值交换类似题目做一个总结分析。其中包含直接交换、通过指针交换、引用交换。下面附上本人的代码,该代码可以较清晰的反映这类题的考察点。大家可以自行研究。

using namespace std;
#include<iostream>
void swap1(int *x,int *y)
{
	cout<<"before x="<<x<<endl;
	cout<<"before y="<<y<<endl;
	cout<<"before *x="<<*x<<endl;
	cout<<"before *y="<<*y<<endl;
	int *z;
	z=x;
	x=y;
	y=z;
	cout<<"after x="<<x<<endl;
	cout<<"after y="<<y<<endl;
	cout<<"after *x="<<*x<<endl;
	cout<<"after *y="<<*y<<endl;
}
void swap2(int *x,int *y)
{
	cout<<"before x="<<x<<endl;
	cout<<"before y="<<y<<endl;
	int z;
	z=*x;
	*x=*y;
	*y=z;
	cout<<"after x="<<x<<endl;
	cout<<"after y="<<y<<endl;
}
void swap3(int **x,int **y)
{
	cout<<"before x="<<*x<<endl;
	cout<<"before y="<<*y<<endl;
	int *z;
	z=*x;
	*x=*y;
	*y=z;
	cout<<"after x="<<*x<<endl;
	cout<<"after y="<<*y<<endl;
}
int main()
{
	int a=1,b=2,*pa,*pb;
	pa=&a;
	pb=&b;
	swap1(pa,pb);
	//swap2(pa,pb);
	//swap3(&pa,&pb);
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl;
	cout<<"pa="<<pa<<endl;
	cout<<"pb="<<pb<<endl;
	cout<<"*pa="<<*pa<<endl;
	cout<<"*pb="<<*pb<<endl;
	return 0;
}

本代码定义了三个函数,分别为swap1,swap2,swap3。其中前两者的形参为一级指针,第三个为二级指针。在正式讲述之前,再放出两组代码。请读者先自行复制代码尝试是否能在脑海中自学完成。
下面代码为查看函数调用时形参与实参的地址。

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

下面代码为南京理工大学某一考试题。

using namespace std;
#include<iostream>
void f1(int *s1,int *s2)
{
	int s3=*s1;
	*s1=*s2;
	*s2=s3;
}
void f2(int *s1,int *s2)
{
	int *s3=s1;
	s1=s2;
	s2=s3;
}
void f3(int *s1,int *s2)
{
	int *p1=new int;
	int s3=*s1;
	*p1=*s2;
	*s2=s3;
}
int main()
{
	int a=1,b=2;
	int *pa=&a,*pb=&b;
	f1(pa,pb);cout<<a<<' '<<b;
	f2(pa,pb);cout<<a<<' '<<b;
	f3(pa,pb);cout<<a<<' '<<b;
	return 0;
}

这种类型题目本质在于指针指向元素,在不影响元素本身的情况下,任何使用调换都是徒劳的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值