2013-03-29 121 views
6

我明白const char *與字符*

char *s = "Hello World!" ; 

被存儲在只讀存儲器和所述字符串文字不能經由指針進行修改。

這是如何從

const char *s = "Hello World!"; 

不同的也就是 '串' 的char *或爲const char *的類型?

+0

第一種方式已經過時和危險的。 – Beta

回答

6

通過給類型const char *,這樣不容易意外覆蓋的內存,因爲如果你嘗試編譯器會給出錯誤:

const char *s = "Hello World!"; 
s[0] = 'X'; // compile error 

如果你不使用const,那麼問題直到運行時才能被捕獲,否則可能會導致程序出錯。

+0

哦,是的,我看到試圖修改char * s,編譯成功,但const char * s,不。所以基本上把const作爲一個紅旗來改變字符串。酷! – dharag

8

區別在於後者是合法的,前者不是。這是在C++ 11中做出的改變。形式上,"Hello World!"的類型爲const char[13];它可以轉換爲const char*。在過去的日子裏,它的類型可以是char[13],它可以轉換爲char*。通過添加const,C++改變了數組的類型,但保持轉換爲char*,以便使用char*的現有C代碼可以在C++中工作,但修改指針指向的文本會產生未定義的行爲。 C++ 11取出轉化爲char*,所以現在你只能做法律

const char *s = "Hello world!"; 
+0

'C++ 11刪除了轉換爲char *' - 不在gcc48中。這是gcc的錯誤? –

+0

@LeonidVolnitsky - 在C++ 11中不允許轉換。規則是,編譯器必須針對違反約束條件的問題發出診斷,該約束條件不會說「不需要診斷」。所以只需要一個診斷,這有時是一個警告。 –

+0

如果增加'const'改變類型,不會'const '或'const '更合乎邏輯嗎? –