C++指針的引用理解

指針可以作爲參數傳遞直接修改所指的變量的值,如下代碼:

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。修改成功。
}

重點:理解其中的關鍵就是所要修改的是指針的值還是指針所指向的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章