引用
別名
- 一定要初始化 (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