&(引用) 和 *(指針)
引用:
引用相當於給引用的對象起一個別名,對引用的操作即是對原對象的操作。
使用方式:
int cnt = 1024;
int &x = cnt;
一般情況下引用的類型要和被引用對象一致(例外是常量引用可以和對應的非常量對象綁定)。
一般在初始化變量時,初始值會被拷貝到新建的對象中。然而定義引用時,程序把引用和它的初始值綁定在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值對象綁定在一起。因而無法令引用重新綁定到另外一個對象,因此引用必須初始化。
引用並非對象,它只是為一個已經存在的對象起另外一個名字。
定義了一個引用之後,對其進行的所有操作都是在與之綁定的對象上進行的:
int cnt = 1024;
int &x = cnt;
x = -1;//給引用x賦值為-1,即給cnt賦值-1,所以此時cnt的值為-1
因為引用不是對象,所以不能定義引用的引用(引用就是給一個對象起個別名,反之若一個變量不是對象,則起不能有引用)。
非常量引用不能與字面值綁定在一起
1 int &x = 1024;//錯誤用法 2 3 const int &x = 1024;//正確用法
指針:
指針是指向另外一種類型的復合類型。與引用類似,指針也實現了對其他對象的間接訪問。不過指針與引用又有很多不同點。其一,指針本身也是一個對象,允許對指針賦值和拷貝,而且在指針的生命周期內它可以先後指向幾個不同的對象。其二:指針無需在定義時賦初值。和其他內置類型一樣,在塊作用域內定義的指針如果沒有被初始化,也將擁有一個不確定的值。
使用方式:
int cnt = 1024;
int *x = &cnt;
指針存放的是對象的地址,要獲取該地址需要用取地址符(&)。
一般情況下聲明指針的類型需要和其指向的對象類型一致(例外是常量指針可以指向一個對應的非常量對象)。
指針的值(即地址)應屬於下列4種狀態之一:
1.指向一個對象;
2.指向緊鄰對象所占空間的下一個位置(如vector的end指針);
3.空指針,意味著指針沒有指向任何對象;
4無效指針,也就是上述情況之外的其他值。
可以用解引用符獲得指針的對象,但只能對指向某個對象的有效指針解引用。
空指針
空指針不指向任何對象,在試圖使用一個指針之前應該先檢查該指針是否為空。
聲明一個空指針的方法:
1 int *p1 = 0; 2 3 int *p2 = nullptr; //等價於int *p2 = 0; 4 5 //使用nullptr需先引用頭文件cstdlib 且使用c++11編譯環境 6 7 int *p3 = NULL;
在c++11標準下應盡量使用nullptr給指針賦初值。
不能使用 int 類型給 int * 類型賦值,即便 int 變量恰好等於 0 也不行。
如:
1 int cnt = 0; 2 3 int *p = cnt; 4 5 //不能通過編譯。 6 7 //在c++11標準之前 8 9 const int cnt = 0; 10 11 int *p = cnt; 12 13 //是能夠通過編譯的,不過 c++11標準之後就不行了。
void * 指針
void * 是一種特殊類型的指針,可用於存放任意對象的地址。一個void*指針存放著一個地址,這一點和其它指針類似。不同的是並不能確定該指針中對象的類型。
如:
1 int cnt1 = 1024; 2 3 int cnt2 = 3.14; 4 5 int *p; 6 7 p = &cnt1; 8 9 p = &cnt2;
是可以通過編譯的。不過void*可以做的事比較有限:拿它和別的指針比較,作為函數的輸入或輸出,或者賦給另一個void*指針。不能直接操作void*指針的對象(不能將其賦值給void*外的其他類型指針,不能通過cout輸出其所指對象等等)。
指向指針的引用:
引用本身不是一個對象,因此不能定義指向引用的指針。但指針是對象,所以存在對指針的引用:
1 int cnt = 1024; 2 int *p = nullptr; 3 int *&r = p;//r是一個對指針p的引用 4 5 r = &cnt;//r引用了指針p, 賦值&cnt給r即賦值&cnt給p 6 cout << (*r) << " " << (*p) << endl;//輸出1024 1024 7 *r = 0;//解引用r得到0,即p指向的對象的值改為0 8 cout << (*r) << " " << (*p) << endl;//輸出0 0
面對一條比較復雜的指針或引用聲明語句時,要理解其類型到底是什麽,最簡單的辦法是從右往左閱讀其定義。離變量最近的符號(此列中*&r是&符號)對變量有最直接的影響,因此r是一個引用。聲明符的其他部分用以確定r引用的類型是聲明,此列中的符號*說明r引用的是一個指針,最後,聲明的基本數據類型部分指出r引用的是一個int指針。
&(引用) 和 *(指針)