引用(Reference)與指針(Pointer)

引用(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  

轉載請註明轉自

http://blog.csdn.net/u012606927/article/details/19043295

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章