這聽起來可能太瘋狂了,但我只是有一個想法。 In C爲什麼爲什麼char *可以在C中保存單個字符?
char *pc = 'H'; // single character
char *ps = "hello"; // a string
兩者都有效嗎?我的意思是爲什麼一個char*
可以容納/引用一個字符以及一個以空字符結尾的字符串?
爲什麼沒有爲*pc
生成警戒子句或編譯器錯誤,因爲char*
未持有以空字符結尾的字符串?
我在Ideone檢查了它,並沒有得到任何警告。
這聽起來可能太瘋狂了,但我只是有一個想法。 In C爲什麼爲什麼char *可以在C中保存單個字符?
char *pc = 'H'; // single character
char *ps = "hello"; // a string
兩者都有效嗎?我的意思是爲什麼一個char*
可以容納/引用一個字符以及一個以空字符結尾的字符串?
爲什麼沒有爲*pc
生成警戒子句或編譯器錯誤,因爲char*
未持有以空字符結尾的字符串?
我在Ideone檢查了它,並沒有得到任何警告。
char *pc = 'H';
上述語句定義char *
類型的pc
這意味着它可以容納char
類型的對象的地址。您正在使用字符H
進行初始化 - 這是一種不同的類型。請記住,字符文字的類型爲int
,並計算爲其ASCII碼中的字符代碼爲72
。所以,上面的語句相當於
char *pc = 72;
這是一個非法操作,編譯器應該向您發出警告(GCC中,使用標誌-Wall
)。您不應該直接將地址分配給指針,因爲您不知道是否有權訪問內存地址。您應該使用address of
運算符&
來獲取對象的地址,然後將其分配給指針。
char *ps = "hello";
在上述語句中,字符串文字的計算結果爲一個指針到它的第一個元素。這個地址被分配到ps
,它是相同類型的,即char *
。但是,在字符串爲只讀在C
但不是const
合格的(不像C++
),因此嘗試使用指針ps
會在編譯器錯誤,但不確定的行爲,最有可能導致程序崩潰是由於段錯誤不會導致修改字符串常量。因此,你應該定義ps
爲指針,以一個const object
-
const char *ps = "hello";
它可以保持char
因爲有一個隱式轉換從char
到char *
(經由int
),並且因爲sizeof(char *) >= sizeof(char)
。儘管(從技術上講,它是未定義的行爲,因爲字符的文字數值不可能是指向char
類型的有效指針地址),所以應該不是。
在許多/大多數編譯器,這確實發出警示:
$ gcc -otest test.c
test.c:5: warning: initialization makes pointer from integer without a cast
在
char *pc = 'H';
'H'
爲int
將澆鑄爲char *
,將被用於初始化pc
,編譯器應該給出警告。
在
char *ps = "hello";
"hello"
將計算爲它的基地址,這將在用於初始化ps
。
當我編譯使用克++上面的代碼行,得到以下的警告:
test-12.c:1:12: warning: initialization makes pointer from integer without a cast [enabled by default]
編譯器執行幾個自動強制轉換到初始化pc
。
char
- >int
- >char*
。
你只需要注意編譯器警告來檢測異常操作,就像你正在嘗試。
我不認爲'字符* PC =「H''做你的想法。 – clcto
如果您嘗試過'printf(「%s」,pc);',可能會發生非常有趣的事情。可能是垃圾輸出或崩潰。 –
聆聽您的警告或調高警戒級別。 –