2011-12-08 22 views
2

我有一個例子:如何完成資格轉換?

int i = 1; 
const int *b = &i; 

在這種情況下,我不明白的是, 當i地址被轉換爲指針到const int的。 i不會在資格轉換中轉換爲常量整數嗎?在進行資格轉化時,究竟發生了什麼?

回答

6

引擎蓋下沒有任何反應。 const是嚴格編譯時的實體。編譯器僅使用const的知識來決定語句是否爲錯誤,而不是用於生成代碼。從而執行以下操作:

int i = 1; 
const int *b = &i; 

相當於

int i = 1; 
int *b = &i; 

在產生碼術語。但是如果你做到以下幾點:

int i = 1; 
const int *b = &i; 
*b = 1; 

編譯器會注意到bconst(雖然它什麼都不知道的i),並會出錯誤。但是,任何不被認爲是具有const常量的語句都會生成相同的代碼。我的

+0

+1很有幫助。這個答案來自哪個參考或書籍? – user1086635

+0

@ user1086635:我沒有這方面的參考資料,但我相信你可以在標準的某處找到它。 – Dani

1

地址被轉換爲指針const int的

&i仍然是int(不是const int)的地址。在引擎蓋下int*被隱式轉換爲const int*。因此*b不可修改,但i仍可修改。

此外,認爲不同的方式:如果你的假設是真的,那麼下面就給編譯器錯誤,但事實並非如此:

int i = 1; 
const int *b = &i; 
int *c = &i; // perfectly valid !