看板 C_and_CPP 關於我們 聯絡資訊
搞不太懂 char *p; 跟 char p[100];間的差異 ex1 char *p = "xxxxx"; p++; OK // 這邊p會甚麼可以更改呢 他不是等於陣列名稱了嗎 ------------------ char p[100] = "xxxxx"; p++; compile error // 這邊是因為陣列名稱不能更改 ex2 char *p = "xxxxx"; gets(p); compile ok 但是run time error ---------------------- char p[100] = "xxxxx"; gets(p); OK ex2整個觀念都不太懂 為啥會對會錯 煩請高手解答 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 39.15.164.85
prismwu:ex1 char *p 是指標不是陣列 指標本來就可以做加減 04/26 00:31
prismwu:ex2 compiler會過是因為型別沒錯 compiler默認陣列為指標 04/26 00:33
prismwu:但是char* p指向一個唯讀的字串 所以一跑想要寫東西就錯 04/26 00:34
loveme00835:陣列 "不是" 指標, 但是陣列會 decay 成指標, 值是第 04/26 00:35
loveme00835:一個元素的位址 04/26 00:35
kumusou:因為我是想說陣列名稱是常數指標 指標是變數指標 04/26 00:36
kumusou:所以指標變數的限制較少 所以我想說EX2中 p指標為什麼不 04/26 00:37
kumusou:WHY不能被更改? 她明明就只是一個變數指標又不是陣列名稱 04/26 00:38
kumusou:就是EX2讓我混亂了 = =感覺跟EX1有矛盾到.. 04/26 00:39
azureblaze:因為p指向唯讀記憶體 04/26 00:51
azureblaze:char p[100] = "xxxxx"會把"xxxxx"從唯讀複製到p裡 04/26 00:52
azureblaze:p* = "xxxxx" 會直接指向唯讀記憶體 04/26 00:53
azureblaze:所以正確寫法是const char *p = "xxxxx" 04/26 00:54
kumusou:有點懂了 所以是說"XXXXX"會被配置一塊記憶體位置(假設FF) 04/26 00:56
kumusou:然後P[100]="XXXXX"中 &p並不會等於FF 而只是複製FF的值 04/26 00:58
kumusou:所以可以被更改 而CHAR *P 的P就是FF 04/26 00:59
kumusou:而且FF是一塊不能被更改的記憶體位置 所以*p更改會錯 04/26 01:00
kumusou:這樣理解對嗎 @@ 04/26 01:00
diabloevagto:對 04/26 01:13