基礎知識 | 每日一面(68)

古代的劍客們與

對手相逢時,無

論對手多麼強大,

明知不敵,也要亮出自己的劍!

讀者:既然不能修改字符串常量, 為什麼不把它們定義為字符常量的數

組?

小林:一個原因是太多的代碼包含char *p = "Hello, world!";這樣並不正確的語句。這樣的語句要受診斷信息的困擾,但真正的問題卻出

現在改變 p 所指目的的任何企圖。

讀者:「const char *p」 和 「char * const p」 有何區別?

小林:「const char *p」 聲明了一個指向字符常量的指針, 因此不能改變它所指向的字符; 「char * const p」 聲明一個指向字符的指針常量, 就是說, 你不能修改指針。

讀者:為什麼我不能向接受 const char ** 的函數傳入 char **?

小林:你可以向接受 const-T 的指針的地方傳入T的指針。但是, 這個允許在帶修飾的指針類型上輕微不匹配的規則卻不能遞歸應用, 而只能用於最上層。如果你必須賦值或傳遞除了在最上層還有修飾符不匹配的指針, 你必須明確使用類型轉換,不過, 通常需要使用這樣的轉換意味着還有轉換所不能修復的深層次問題。

有時候,正是那些意想不到之人,成就了無人能成之事。

——圖靈