1. 如何用指针交换两个数的值?
——我们都知道使用swap函数。
2. 以下有两种swap函数,
//交换指针
void swap1(int *a,int *b)
{
int *c;
c=a;
a=b;
b=c;
}
//交换指针所指向的变量值
void swap2(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=*c;
}
能否都能实现值的交换?
//验证如下
int main(){
int x=3,y=5;
int *p=&x,*q=&y;
printf("x=%d,y=%d\n",*p,*q);
swap1(p,q);
printf("swap1:x=%d,y=%d\n",*p,*q);
swap2(p,q);
printf("swap2:x=%d,y=%d\n",*p,*q);
system("pause");
return 0;
}
运行结果:
3. 分析如下
- swap1()
对于C/C++语言来说,在调用函数时系统是传值给函数。所谓的“形参”和“实参”只是参数和值的关系,并不是实参取代了形参。
一个典型的例子:
void swap(int x, int y){
int t;
t=x;
x=y;
y=t;
}
int main(){
int a=3,b=5;
swap(a,b);
printf("swap:a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
可知,这个函数无法实现值的交换。
分析:a的值传给了x,b的值 传给了y,x与y在swap函数的变量空间中进行了交换。当swap函数结束,x、y释放空间,main函数中的a、b没有任何变化。 也就是x、y与a、b没有关系。自己可以调试一下,在main函数中,x、y显示“Not found in current context.”,在swap函数中,a、b也会显示。
因此!上面的swap1函数也是一样的,它传递的是地址(地址也是值)。swap1函数内部指针a和指针b交换,但main函数中指针p和指针q,即a和b的地址并没有交换。
- swap2()
main函数中的p、q分别传递给swap2函数中的a、b,也就是a与p、b与q的值是一样的,都是x和y的地址。在swap2函数中改变该地址上的值,那么main函数中该地址上的值同时也发生了变化。 因为地址是共享的。
~~ ~~
【结论】
指针互换无法实现值互换,但是,互换指针所指向的值可以实现。
4. 交换值的另一方法——引用
void swap(int &x, int &y){
int t;
t=x;
x=y;
y=t;
}
int main(){
int a=3,b=5;
swap(a,b);
printf("swap:a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
形参x是实参a的引用,形参y是实参b的引用,实参取代了形参,所以对形参的操作实际就是对实参的操作。