[問題] 字串賦值問題

看板C_and_CPP (C/C++)作者 (小天)時間11年前 (2014/10/19 23:33), 編輯推噓10(10013)
留言23則, 6人參與, 最新討論串1/1
ex1: char str[6] = "hello"; *str = 'x'; // 編譯通過 ex2: char *str = "hello"; *str = 'x'; //編譯失敗 想請問是為什麼呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.25.105 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1413732792.A.055.html

10/19 23:41, , 1F
置底十三誡之四
10/19 23:41, 1F

10/20 00:06, , 2F
ex1的str是陣列第一個元素的位址 會變成xello
10/20 00:06, 2F

10/20 00:07, , 3F
ex2的str是字元指標 字元指標重新指定字串要 str='x'
10/20 00:07, 3F

10/20 00:11, , 4F
字串會整個被改成x 而且應該要用雙引號代表字串"x"
10/20 00:11, 4F

10/20 00:31, , 5F
第二個指向唯讀區,就算能編譯也不能執行
10/20 00:31, 5F

10/20 00:53, , 6F
不過原來這樣會 error 啊, 我一直以為會通過然後 crash
10/20 00:53, 6F

10/20 00:58, , 7F
死背
10/20 00:58, 7F

10/20 22:04, , 8F
連這都要死背的話還是別寫程式吧 (望) 另外四樓後半不對
10/20 22:04, 8F

10/20 22:04, , 9F
它想做的跟 ex1 是一樣的, 兩者差別就只是五樓說的這樣而已
10/20 22:04, 9F

10/21 00:37, , 10F
如果要跟ex1一樣只改字串中的單一字元是辦不到的
10/21 00:37, 10F

10/21 00:37, , 11F
因為你的str是字元指標會指到一個字串
10/21 00:37, 11F

10/21 00:38, , 12F
他並沒有像字元陣列有偏移的概念 所以不能拿str改字元
10/21 00:38, 12F

10/21 00:45, , 13F
所以*str跟*str[0]是一樣意思 都是不行的~
10/21 00:45, 13F

10/21 00:58, , 14F
唔嗯, C 語言的字串就只是個尾巴有個 '\0' 的字元陣列而已
10/21 00:58, 14F

10/21 00:59, , 15F
所以 ex2 之所以做不到的原因完全是因為唯讀
10/21 00:59, 15F

10/21 01:41, , 16F
喔喔 LPH66大大說的才是對的 系統會找個位址放字串常
10/21 01:41, 16F

10/21 01:42, , 17F
數 然後把位址回傳給str 但這個位址系統不給用(唯獨)
10/21 01:42, 17F

10/21 01:44, , 18F
字元指標一樣有偏移的概念,a[b]等同*(a+b)等同b[a]
10/21 01:44, 18F

10/21 01:44, , 19F
只能重新讓系統找新的位址放字串常數 回傳字串常數的
10/21 01:44, 19F

10/21 01:44, , 20F
位址這樣 受教了~~
10/21 01:44, 20F

10/21 01:46, , 21F
所以*str等同str[0]跟0[str]
10/21 01:46, 21F

10/21 01:50, , 22F
第二個是因為str指向唯讀區,*str相當於修改唯讀區
10/21 01:50, 22F

10/22 10:58, , 23F
原來如此! 感謝各位解答!
10/22 10:58, 23F
文章代碼(AID): #1KGzcu1L (C_and_CPP)
文章代碼(AID): #1KGzcu1L (C_and_CPP)