天天看點

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 和存儲的值 p ,p存儲的資料類型實際為存儲的對象的資料位址,故要通路存儲的對象需要對變量名進行 “解引用” *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
           

繼續閱讀