引用
别名
- 一定要初始化 (int &c; //error)
- 引用 不能引用 不可以取位址的資料(如常量)
- 引用不能改變
- 引用隻能使用 引用變量 所引用的資料
- 底層使用指針支援,在所有變量使用的地方系統會自動解引用
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 的别名。
不同點:
- 指針是一個變量,隻不過這個變量存儲的是一個位址,指向記憶體的一個存儲單元,可以定義指向指針的指針。而引用僅是個别名,沒有實際位址,是以不能定義指向引用的指針,也不能定義指向引用的引用。
- 引用使用時無需解引用(*),指針需要解引用;
- 引用隻能在定義時被初始化一次,之後不可變;指針可變;
- 引用不能為空,指針可以為空;
- “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身的大小;
- 指針和引用的自增(++)運算意義不一樣;(引用的++(自增運算)是其指向的對象本身的運算,而指針的++是記憶體位址的++)
- 指針可以有多級,但是引用隻能是一級(int **p;合法 而 int &&a是不合法的)
- 指針通過某個指針變量指向一個對象後,對它所指向的變量間接操作。引用本身就是目标變量的别名,對引用的操作就是對目标變量的操作。
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