2011-03-14 27 views

回答

7

它編譯,因爲所有這些指針醚不改變const的變量訪問企業資質或強制執行的資格,但他們沒有試圖疏鬆n資格。

例如:

const int var; 
int* address = &var; //illegal - tries to remove const 

會試圖去一個const變量非const訪問,這就是非法的,但

int var; 
const int* address = &var; //legal - only adds const 

試圖獲得一個非const變量常量訪問和這是合法的,因爲非const變量確實允許僅限const的訪問。

+0

不應該它會拋出一個錯誤,當一個指針到常量整數採取了一個不是const的int的地址? – Sadique 2011-03-14 14:44:46

+5

@Acme:爲什麼?如果我可以*讀寫*它意味着我可以*讀*。 – sharptooth 2011-03-14 14:49:20

+1

@Acme添加常量永遠不需要顯式強制轉換。刪除常量可能是危險的。 – 2011-03-14 14:50:44

3

因爲它沒有錯?

同類型的兩個方面:int *ptr=&i;

更多的常量,完全確定:int const *ptr_1=&i;

完全一樣上面一行:const int *ptr_2=&i;

更多的常量,完全確定:const int * const ptr_3=&i;

你總是可以做一個變量更多 const。

int const * i; 
int * j = i; 

上面使得Ĵ更少常量和無效。

4.4/1:(封面int *int const *

類型「指針CV1 T」 的右邊的值可以被轉換爲類型 「指針CV2 T」如果「CV2 T的右值」不止 CV-合格‘CV1 T’

0

您可能想知道爲什麼在取得地址時可以將const作爲值。

這是合法的,被稱爲const促銷用C++的說法。

請注意,只有一個級別的const推廣可能發生 - 那就是,一個int**可晉升爲int* const*而不是int const**(在const必須「動」兩個地方到左)。

0

C++允許您創建指向堆棧上創建的變量的指針。因此,這段代碼沒有任何問題。而且,它通常用於將參數傳遞給諸如WINAPI之類的函數。

如果有關指針語義的問題,那麼答案是全面的。 例如:

int * ptr; //pointer to a variable. Pointer and the variable can be changed. 
int const * ptr; //a pointer to the constant variable, a pointer can be changed, the variable can not. 
const int * ptr; //same as above. 
const int * const ptr_3; //the most interesting section, a const pointer to const variable. 

只要記住,修飾語之前*指的是可變的,後 - 指針。