程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Pointers與References(一)

Pointers與References(一)

編輯:關於VC++

譯者注:本文節選自《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;
}

......待續。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved