指针可以作为参数传递直接修改所指的变量的值,如下代码:
void change(int *p){
*p = 20;
}
int main(){
int a = 10 ;
int * pa = &a;
change(pa);
cout<<"a = "<<a<<endl;//输出20
cout<<"*pa = "<<*pa<<endl;//输出20
}
指针传递实际上也是值传递,传递的值便是指针的地址,执行* p = 20后,虽然传递的是一个地址的副本,但是副本的值就是变量的地址,执行后,所指向的地址的值变成了20,达到了修改变量值的目的。所以,当需要修改指针所指向的对象时,这种传递方式就有问题了,因为修改的是指针的副本,所以原本指针所指向的对象并没有发生改变,这个效果就像普通的swap函数一样,如下代码:
int m = 30;
void change(int *p){
p = &m; //期望的是修改p指向m,即期望修改指针的值,但实际上只是副本指向了m
}
int main(){
int a = 10 ;
int * pa = &a;
change(pa);
cout<<"a = "<<a<<endl;//输出10
cout<<"*pa = "<<*pa<<endl;//输出10,并没有修改成功。
}
如果代码改为如下:
int m = 30;
void change(int *&p){ //指针的引用
p = &m; //期望的是修改p指向m,但实际上只是副本指向了m
}
int main(){
int a = 10 ;
int * pa = &a;
change(pa);
cout<<"a = "<<a<<endl;//输出10
cout<<"*pa = "<<*pa<<endl;//输出30。修改成功。
}