指针与非指针的交换函数
下面将给出7个交换函数,
你能马上看出哪些交换函数真的起作用了吗?
void swap1(int a,int b){
int c;a=b;b=c;
}
int main(){
int aa=233,bb=332;
swap(aa,bb);
return 0;
}
swap1 × < - 答案在这里 (你没发现这里空出来了吗?)
原因是在main函数中调用swap1()时,将实参a,b的值传递给了交换函数,如果此时在swap1()中打印出a,b的值,可以发现a,b的值交换了.但是该过程其实是将aa和bb分别复制了一份给了函数,执行完swap1()之后,aa和bb的没有任何变化.
void swap2(int *a,int *b){
int *c;
c=a;a=b;b=c;
}
int main(){
int aa=233,bb=332;
swap(&aa,&bb);
return 0;
}
swap2 × < - 答案在这里
这里是将形参(指针)的值给交换了,即直叫唤了形参中 *a与 *b的地址.那么更不用说把aa和bb的值给交换了.
而swap2中未给c赋值,c可能指向一个未知的存储单元,且该单元的数据可能是有用的,因此swap2()不但没有实现两个数的交换,反而给系统的稳定性带来威胁.可以int *c=new int
来避免这种威胁.
void swap3(int *a,int *b){
int *c=new int;
c=*a;*a=*b;*b=*c;
}
int main(){
int aa=233,bb=332;
swap(&aa,&bb);
return 0;
}
swap3 × < - 答案在这里
将int赋值给*int,编译错误
void swap4(int *a,int *b){
int c;
c=*a;*a=*b;*b=*c;
}
int main(){
int aa=233,bb=332;
swap(&aa,&bb);
return 0;
}
swap4 √ < - 答案在这里
为了使在函数中改变了的变量能被其他函数调用,正确的办法是用指针变量作为函数参数没在函数执行过程使用指针变量所指向的变量值发生变化.
void swap5(int &a,int &b){
int c=a;a=b;b=c;
}
int main(){
int aa=233,bb=332;
swap(aa,bb);
return 0;
}
swap5 √ < - 答案在这里
使用了’&’,对于引用的操作实际上是作用在引用所引得对象上
我的理解是:使用了’&’,则在调用函数时,会直接在a的地址上进行修改,因此在使用函数后,aa与bb地址上的值被交换了,因此它们的值就真的被交换了.
void swap6(int &a,int &b){
a=a+b;
b=a-b;
a=a-b;
}
int main(){
int aa=233,bb=332;
swap(aa,bb);
return 0;
}
swap6 √ < - 答案在这里
int c=a,d=b;
第一条语句:a=a+b;即a=c+d;
第二条语句:b=a-b;即b=c+d-d=c;
第三条语句:a=a-b;即a=c+d-c=d;
这样a和b的值就交换了,再基于swap5()则aa和bb的也交换了.
void swap7(int &a,int &b){
a=a^b;
b=a^b;
a=a^b;
}
int main(){
int aa=233,bb=332;
swap(aa,bb);
return 0;
}
swap7 √ < - 答案在这里
首先要说明A^A=0;(这个能懂吧,异或就是”同假异真”,A与A完全相同,故A^A=0).
这样就可以比较好地推出来了.
看了这么多是不是有点头晕,现在你对交换函数是否有了更深的理解?^_^