c++:指針和引用的區別(相同點和不同點)

    引用
        別名 

  1.  一定要初始化   (int &c;  //error)
  2.  引用 不能引用 不可以取地址的數據(如常量)
  3.  引用不能改變
  4.  引用只能使用 引用變量 所引用的數據
  5.  底層使用指針支持,在所有變量使用的地方系統會自動解引用
int a = 10;
int& b = a;
&b =c// 錯誤,引用不能改變

    int &a = 10;      //錯誤,引用類型的初始值必須是一個對象,能取地址

    double a = 3.14;
    int & b = a;       //錯誤,此處的引用類型的初始值必須是int型的對象,引用符號與類型像匹配

相同點:都是地址的概念

指針:由於指針 *p 也是對象,其本身也有地址&p 和存儲的值 pp存儲的數據類型實際爲存儲的對象的數據地址,故要訪問存儲的對象需要對變量名進行 “解引用” *p。
引用:對象的別名,b 爲 a 的別名。

不同點:

  1. 指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元,可以定義指向指針的指針。而引用僅是個別名,沒有實際地址,所以不能定義指向引用的指針,也不能定義指向引用的引用。
  2. 引用使用時無需解引用(*),指針需要解引用;
  3. 引用只能在定義時被初始化一次,之後不可變;指針可變;
  4. 引用不能爲空,指針可以爲空;
  5. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身的大小;
  6. 指針和引用的自增(++)運算意義不一樣;(引用的++(自增運算)是其指向的對象本身的運算,而指針的++是內存地址的++)
  7. 指針可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的) 
  8. 指針通過某個指針變量指向一個對象後,對它所指向的變量間接操作。引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。

    int i = 45;

    int* p;           //p是一個int型的指針(可以把int*當成是一個類型)

    int* &r = p;      //r是一個對指針p的引用(r是一個引用,它的類型爲int*)

    r = &i;           //r引用了一個指針,因此給r賦值&i就是令p指向i

    *r = 0;           //解引用r得到i,也就是p指向的對象,將i的值改爲0

 

 

 

 

 

 

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