1. 程式人生 > >&(引用) 和 *(指針)

&(引用) 和 *(指針)

作用域 引用 都是 因此 種類型 初始化 數據 pan 函數

引用:

引用相當於給引用的對象起一個別名,對引用的操作即是對原對象的操作。

使用方式:

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指針。

&(引用) 和 *(指針)