引用(Reference)與指針(Pointer)
[聲明與初始化]
與pointer類似,reference也是一個對象(object),可以用來間接指向另一個對象。reference的聲明與pointer的聲明的實質語法結構是相同的。不同的是,聲明pointer的時候使用星號操作符*,而聲明reference的時候使用地址操作符&。
int i = 3;
int *pi = &i;//聲明 pi 爲一個指針類型的對象,並且是一個”指向int整型的指針”,它的初始值爲對象i的地址。
int &ri = i;//聲明 ri爲一個reference類型的對象,並且也是一個指向整型的reference,它指向的是i。
[最大的不同]
Pointer 和reference的最大不同是:pointer必須使用一個星號操作符*進行解引用操作,而reference不需要任何操作符,這裏可以將reference看成是一個高級的指針。
下面通過內存的存儲形式來理解這一點。
*p = 4; //使用pointer將i的值變爲4
ri = 4; //使用reference 將i的值變爲4 。
[內存中存儲形式]
[其他的不同之處]
1 指針變量能夠可以被重新賦值很多次,但是引用不可以,引用一旦初始化賦值後就不可以再對其重新賦值,有點像常量指針。引用一般被理解爲對某個變量其別名。對引用的操作與對應變量的操作的效果完全一樣。如果再將該別名與另外一個變量聯繫在一起,就會出現一個名字(別名)對應兩個變量,很明顯這不正確。
簡而言之,一個pointer在它的有生之年可以指向許多不同的對象,而一個reference只能夠指向一個對象。所以,一個reference就必須在一出生就被綁定。否則這個reference就永遠不能被綁定到任何東西,也就毫無用處了。
int &ri = i;//將 ri 綁定到 i 。然後下面的賦值:
ri = j;//並不是把 ri 綁定到 j ,而是將 j 中的值賦給 ri 指向的對象,也就是賦給 i 。
2 一個有效的reference必須指向一個對象;而一個指針不需要,例如NULL指針不指向任何位置。
這點在應用中十分廣泛,當你想要確信一個參數必須指向一個對象的時候,應該使用reference作爲參數類型。 例如,交換函數(swap function),它接受兩個int參數,並將兩個參數的數值對調,如下所示:
int i, j;
swap(i, j);
而將原本在i中的值放到j中, 並將原本在j中的值放到i中。我們可以這樣寫這個函數:
void swap(int *v1, int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
這種定義下,函數要像這樣被調用: swap(&i, &j);
[參考文獻]
http://www.prglab.com/blog/p/28
轉載請註明轉自