关于数据交换的测试分析
本人在经过多次学校的考试题目折磨后,终于下定决心对数值交换类似题目做一个总结分析。其中包含直接交换、通过指针交换、引用交换。下面附上本人的代码,该代码可以较清晰的反映这类题的考察点。大家可以自行研究。
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;
}
这种类型题目本质在于指针指向元素,在不影响元素本身的情况下,任何使用调换都是徒劳的。