c++中的字元串常量為什麼可以賦值給char*?

比如可以寫一下代碼:

char*str="hello";

其中的"hello"不是const char*類型嗎?為什麼可以給char*賦值?


C中"hello"類型是char[6],所以允許char* str="hello"; 你甚至可以接著使用 *str = "d" 這樣賦值,編譯通過沒問題只不過會在運行時報錯,因為"hello"位於只讀存儲區不允許寫操作。

C++中"hello"的類型是const char[6],不過為了兼容C代碼做了特殊處理,所以也允許賦值給char*指針。


一句話:為了兼容舊有的代碼。


這種語法的存在只是為了兼容C 舊有的代碼。

對於 char* str = "hello";

使用C++編譯器會有警告提示:

warning: deprecated conversion from string constant to "char*" [-Wwrite-strings]|

推薦把類型修改為const char *

也就是說,這種語法的存在,只是為了保證以前的C代碼可以正常編譯。對於標記為deprecated的語法,做為一個C++程序猿,請不要再使用了。因為這樣做可能會導致一個 讓你顏面盡失的內存非法寫操作。


樓主的問題是,如果「hello」是個 const char*,那麼為什麼可以直接複製到 char* 類型,而不需要強制類型轉換。因為這種賦值通常是不允許的,反過來可以。即把 char* 賦值給 const char*沒有任何問題。

答案也很簡單,因為編譯器也是人開發的程序,只要他認為可以,那就可以。大概是已經有太多類似的代碼了。用戶已經習慣這樣寫。所以沒有必要明確的拒絕這樣的代碼通過編譯。


準確來說,不是把「hello」賦值給一個char *的變數,而是把hello存儲在一個區域,然後讓char *指向hello存在的區域。

事實上,char *類型的str被賦予的值是hello第一個字元"h"的地址。你可以試試cout&<&<*str,結果輸出的是h。估計C++在這裡做了一個特殊處理,但究竟是什麼處理我也不太清楚


"hello" 在這裡是一個地址, char * 類型指向一個地址的話,沒有問題, 至於地址的內容能否修改是另一回事

http://blog.csdn.net/supermegaboy/article/details/4854987


決定權在你, 這只是一個地址, 對於c來說, 這完全沒問題, 但是你如果修改這個串的話, 就直接猝死.

對於c++來說, 編譯器可能會做隱式轉換, 但仍然會給你一個友情提示. 總而言之, 不要過份依賴編譯器.

認真關注每一個警告.


const char* 是 char* 的子集!而指針在底層都是一個uint類型,當然可以賦值啦!const char*只是表示「hello」不能修改,與能否將該指針賦值給其他指針根本毫無關係!就算是char* const 類型的指針一樣可以賦值給別的非char* const指針,只是別的指針不能將賦值給它而已!


字元串常量本身的特性就是常量不可變,儲存在內存的靜態數據區,可以用指針進行字元串操作除了改變字元串原本內容;

char* p = "hello";

char* p的指針指向一個字元串常量的首地址,cout&<&

cout&<&<*p&<&想要列印出字元串的首地址可以強轉下輸出指針的類型,cout&<&<(void*)p&<&


為什麼不可以?


推薦閱讀:

我想自己用C/C++做一個腳本語言解釋器,但是不知道需要什麼知識?
c語言中實際上不存在賦值語句?
為什麼GCC會把0xBE-0x33解釋為浮點數?
c語言中指針指向的非指針變數不能使用++或--嗎?
指針是如何記住步長的?

TAG:編程語言 | 編程 | C編程語言 | CC |