我们看下面的代码
#include<bits/stdc++.h>
using namespace std;
void swap(int* a,int*b)
{
int* temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int a,b;
a=7;
b=1;
int* p;
int* q;
p=&a;
q=&b;
swap(p,q);
cout<<*p<<' '<<*q;
return 0;
}
如果你不能确定输出是什么,那么你就和我一样对指针的认识还不够。
实际上输出是7 1,而不是1 7。
我们会认为swap函数传进去的是指针p和q,但实际上只是这两个指针的拷贝。
我们再看下面代码:
#include<bits/stdc++.h>
using namespace std;
void swap(int*a,int*b)
{
int* temp;
temp=a;
a=b;
b=temp;
cout<<a<<' '<<b<<endl; //输出:0x6ffe38 0x6ffe3c
cout<<&a<<' '<<&b<<endl; //输出:0x6ffe00 0x6ffe08
cout<<*a<<' '<<*b<<endl; //输出:1 7
}
int main()
{
int a,b;
a=7;
b=1;
int* p;
int* q;
p=&a;
q=&b;
swap(p,q);
cout<<p<<' '<<q<<endl; //输出:0x6ffe3c 0x6ffe38
cout<<&p<<' '<<&q<<endl; //输出:0x6ffe30 0x6ffe28
cout<<*p<<' '<<*q; //输出:7 1
return 0;
}
我们可以看到,swap里两个指针a,b指向的地址与传入前p,q指向的地址是一样的,都是0x6ffe3c 0x6ffe38,所以我们会经常误以为a,b和p,q是一样的。但是我们再看第二行输出,a,b的地址是0x6ffe00 0x6ffe08,p,q的地址是0x6ffe30 0x6ffe28。因此swap函数传进去的只是p,q两个指针的复制,而不是p,q两个指针。所以我们对a,b修改是对p,q没影响的。正确的写法应该是:
void swap(int*a,int*b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
把p,q两个指针指向地址的元素值进行修改。