#include <iostream>
#define n 255
using namespace std;
int main()
{
int i=n;
int *ptr=&i;
int const *ptr_1=&i;
const int *ptr_2=&i;
const int * const ptr_3=&i;
}
爲什麼在Visual C++,Dev C++和G ++中編譯代碼? 鏈接到- Ideone -儘管採用了錯誤的數據類型地址,代碼編譯
#include <iostream>
#define n 255
using namespace std;
int main()
{
int i=n;
int *ptr=&i;
int const *ptr_1=&i;
const int *ptr_2=&i;
const int * const ptr_3=&i;
}
爲什麼在Visual C++,Dev C++和G ++中編譯代碼? 鏈接到- Ideone -儘管採用了錯誤的數據類型地址,代碼編譯
它編譯,因爲所有這些指針醚不改變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的訪問。
因爲它沒有錯?
同類型的兩個方面: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’
您可能想知道爲什麼在取得地址時可以將const
作爲值。
這是合法的,被稱爲const
促銷用C++的說法。
請注意,只有一個級別的const
推廣可能發生 - 那就是,一個int**
可晉升爲int* const*
而不是int const**
(在const
必須「動」兩個地方到左)。
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.
只要記住,修飾語之前*指的是可變的,後 - 指針。
不應該它會拋出一個錯誤,當一個指針到常量整數採取了一個不是const的int的地址? – Sadique 2011-03-14 14:44:46
@Acme:爲什麼?如果我可以*讀寫*它意味着我可以*讀*。 – sharptooth 2011-03-14 14:49:20
@Acme添加常量永遠不需要顯式強制轉換。刪除常量可能是危險的。 – 2011-03-14 14:50:44