指針可以作爲參數傳遞直接修改所指的變量的值,如下代碼:
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。修改成功。
}