2011-12-26 96 views
6

所以我試圖學習C++,並且遇到了讓我感到困惑的東西。我的代碼,澄清C++中的參考文獻

int x = 0; 
int &y = x; 
cout << &x<< " " << x << " " << &y << " " <<y<< endl; 

編譯沒有和結果:

0 003AFA08 0 003AFA08 

我很難理解爲什麼X,int的轉換,& Y,A參考,不導致錯誤。起初,我認爲這是某種轉換,但是,

int &y = &x; 

導致錯誤。

任何人都可以解釋爲什麼這種方式?提前致謝。

+0

所以你想知道爲什麼流插入運算符'<<'可以將一個變量的地址作爲數字十六進制字符串進行字符串化,但是你不能分配一個'int'的地址(類型爲int *')到'int&'? – bobbymcr 2011-12-26 05:05:53

+3

我猜這是'003AFA08 0 003AFA08 0' – onemach 2011-12-26 05:08:26

回答

11

int&不是地址。這是一個參考

int& y = x;聲明y作爲參考x。這實際上意味着y成爲x的另一個名稱。任何時候你使用y,就好像你說過x

指針(不是引用)用於存儲地址。 int& y = &x;無效,因爲&xx(它是int*)的地址。 y是對int的引用,而不是對int*的引用。

+1

謝謝,剛剛讓C++更有意義... – jozefg 2011-12-26 05:14:27

+0

嚴格地說,'&x'不是*'x'的*地址,而是*指針*即使'&'運算符被稱爲* address-of * :) – fredoverflow 2011-12-26 11:38:40

+1

@FredOverflow:「對象指針類型的有效值表示內存中的字節地址或空指針。」足夠接近我。 :) – GManNickG 2012-01-02 06:59:23

5

這不是一個轉換。當你有一個變量類型T &,其中T是一些隨機類型,你基本上是說「我宣佈一個名稱是另一個名稱或可能是一個匿名值的別名。」。它更像是一個typedef比指針。

參考經常被實現爲地址,但這不是考慮它們是什麼的好模型。

在你的榜樣,你的困惑:

int * const &y = &x; 

會工作得很好。然後y成爲x地址的臨時結果的別名。注意它是對指針的引用。它必須是對常量指針的引用,因爲它是對臨時值的引用。

1

你的問題是,&y不只是一個地址,而是一個參考。這意味着它的行爲如同x的副本。它不轉換,它實際上成爲x的另一個名稱。

2

&y不僅僅是一個地址,它是一個參考。這意味着,

int &y = x; 

使得由y名稱x克隆。