作者:
kdok123 (小天)
2014-10-19 23:33:09ex1:
char str[6] = "hello";
*str = 'x';
// 編譯通過
ex2:
char *str = "hello";
*str = 'x';
//編譯失敗
想請問是為什麼呢?
作者:
LPH66 (-6.2598534e+18f)
2014-10-19 23:41:00置底十三誡之四
ex1的str是陣列第一個元素的位址 會變成xelloex2的str是字元指標 字元指標重新指定字串要 str='x'字串會整個被改成x 而且應該要用雙引號代表字串"x"
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2014-10-20 00:53:00不過原來這樣會 error 啊, 我一直以為會通過然後 crash
作者:
johnpage (johnpage)
2014-10-20 00:58:00死背
作者:
LPH66 (-6.2598534e+18f)
2014-10-20 22:04:00連這都要死背的話還是別寫程式吧 (望) 另外四樓後半不對它想做的跟 ex1 是一樣的, 兩者差別就只是五樓說的這樣而已
如果要跟ex1一樣只改字串中的單一字元是辦不到的因為你的str是字元指標會指到一個字串他並沒有像字元陣列有偏移的概念 所以不能拿str改字元所以*str跟*str[0]是一樣意思 都是不行的~
作者:
LPH66 (-6.2598534e+18f)
2014-10-21 00:58:00唔嗯, C 語言的字串就只是個尾巴有個 '\0' 的字元陣列而已所以 ex2 之所以做不到的原因完全是因為唯讀
喔喔 LPH66大大說的才是對的 系統會找個位址放字串常數 然後把位址回傳給str 但這個位址系統不給用(唯獨)
字元指標一樣有偏移的概念,a[b]等同*(a+b)等同b[a]
只能重新讓系統找新的位址放字串常數 回傳字串常數的位址這樣 受教了~~
所以*str等同str[0]跟0[str]第二個是因為str指向唯讀區,*str相當於修改唯讀區
作者:
kdok123 (小天)
2014-10-22 10:58:00原來如此! 感謝各位解答!