譯者注:本文節選自《How to Think Like A Computer Scientist,Learning with C++》 第16章,作者Allen B. Downey)。此書對於國內“初級”C++愛好者來說,是一本 不可多得的入門書籍。我的這版是PALM電子書。
正文:
我認為最簡單的方法解釋Pointers 和 References就是舉例證明了。首先讓我們看一些表 達式:x=1;
在表達式中,當你使用一個變量,特別是一個字母或標記符來 存儲數據。在編程過程中,上面等式中的變量一定是在等號的左邊。
你可能已經注意到了編譯器不充許你像這樣寫代碼:1=x;
假如你不知道,你現在應該知道,並且理解它,這是最關鍵的。當你得到編譯運行期錯誤 ,如:"lvalue requied in ..."是因為等號左邊通常被當作lvalue的值,必須是 內存中的一個地址。
讓我們想一想。假如你想存儲數據,在存儲數據操作之前知道在哪裡存儲。lvalue值就是 在內存裡的一段地址,來存放你的信息或等號右邊的數據,同理的還有rvalue值。
在C++中,你將經常這樣或那樣涉及內存管理。操作地址,C++有兩種機制:Pointers 和 References。
16.1 什麼是Pointers和 References
Pointers和 References是特殊變量,以存儲內存地址當作它們的值。在你學會這些之前 ,其它相關的不同類型的數據類型還有:
int,double和char。Pointers和 References存放著已經聲明並賦值的,不同數據類型的 ,你所操作數據的地址。這兩種機制 Pointers 和 References,有著不同的語法和不同的慣 性使用方法。
16.2 聲明Pointers和 References
當對一個對象或數據類型的指針進行聲明時,你照例地使用聲明變量和數據類型的方法, 僅是現在,對於聲明SOMETYPE的指針,你需要在數據類型和它的變量之間加上星號*。
SOMETYPE* sometype;
int* x;
對於聲明一個reference,你做的事情是和聲明一個指針完全一樣的,僅僅這次你不使用 星號*,使用—來替換。
SOMETYPE& sometype;
int& x;
可能你已經學過,空位在C++中是不被考慮的,所以以下的指針聲明都是一樣的效果:
SOMETYPE* sometype;
SOMETYPE * sometype;
SOMETYPE *sometype;
以下的references聲明同理也是一樣:
SOMETYPE& sometype;
SOMETYPE & sometype;
SOMETYPE &sometype;
16.3 “尋址”操作符
盡管聲明指針和references看似一樣,但對它們進行賦值卻是另一回事。在C++中,還有 另外一種操作符需要你了解它,一個通過&符號來表示
的操作符,那就是“尋址”操作符。“尋址”操作符做的事如它的 名稱一樣,返回一個變量、常量標識符或一個數組單元的地址,形式如當前類型的
指針。使用“尋址”操作符,加在變量之前使你得到返回的地址。
SOMETYPE* x = &sometype; //必須被當作 rvalue 使用。
現在,不要把“尋址”操作符與聲明一個reference搞混淆。因為使用此操作 符被嚴格局限於rvalue,或是等號的右邊。編譯器知道
&SOMETYPE是“尋址”操作符,表示返回一個SOMETYPE類型指針的地址。
此外,假如你有一個函數,以指針作為參數,你可以在不能聲明成指針的變量上使用 “尋址”操作符。通過這種方法,你不必再聲明一個指針來充當此函數的參數使 用。“尋址”操作符可返回一個指針,因此可以在這種情況下使用:
SOMETYPE MyFunc(SOMETYPE *x)
{
cout << *x << endl;
}
int main()
{
SOMETYPE i;
MyFunc(&i);
return 0;
}
......待續。