[問題] 指標跟陣列

看板C_and_CPP作者時間12年前 (2013/04/26 00:18), 編輯推噓0(0019)
留言19則, 5人參與, 最新討論串1/1
搞不太懂 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

04/26 00:31, , 1F
ex1 char *p 是指標不是陣列 指標本來就可以做加減
04/26 00:31, 1F

04/26 00:33, , 2F
ex2 compiler會過是因為型別沒錯 compiler默認陣列為指標
04/26 00:33, 2F

04/26 00:34, , 3F
但是char* p指向一個唯讀的字串 所以一跑想要寫東西就錯
04/26 00:34, 3F

04/26 00:35, , 4F
陣列 "不是" 指標, 但是陣列會 decay 成指標, 值是第
04/26 00:35, 4F

04/26 00:35, , 5F
一個元素的位址
04/26 00:35, 5F

04/26 00:36, , 6F
因為我是想說陣列名稱是常數指標 指標是變數指標
04/26 00:36, 6F

04/26 00:37, , 7F
所以指標變數的限制較少 所以我想說EX2中 p指標為什麼不
04/26 00:37, 7F

04/26 00:38, , 8F
WHY不能被更改? 她明明就只是一個變數指標又不是陣列名稱
04/26 00:38, 8F

04/26 00:39, , 9F
就是EX2讓我混亂了 = =感覺跟EX1有矛盾到..
04/26 00:39, 9F

04/26 00:51, , 10F
因為p指向唯讀記憶體
04/26 00:51, 10F

04/26 00:52, , 11F
char p[100] = "xxxxx"會把"xxxxx"從唯讀複製到p裡
04/26 00:52, 11F

04/26 00:53, , 12F
p* = "xxxxx" 會直接指向唯讀記憶體
04/26 00:53, 12F

04/26 00:54, , 13F
所以正確寫法是const char *p = "xxxxx"
04/26 00:54, 13F

04/26 00:56, , 14F
有點懂了 所以是說"XXXXX"會被配置一塊記憶體位置(假設FF)
04/26 00:56, 14F

04/26 00:58, , 15F
然後P[100]="XXXXX"中 &p並不會等於FF 而只是複製FF的值
04/26 00:58, 15F

04/26 00:59, , 16F
所以可以被更改 而CHAR *P 的P就是FF
04/26 00:59, 16F

04/26 01:00, , 17F
而且FF是一塊不能被更改的記憶體位置 所以*p更改會錯
04/26 01:00, 17F

04/26 01:00, , 18F
這樣理解對嗎 @@
04/26 01:00, 18F

04/26 01:13, , 19F
04/26 01:13, 19F
文章代碼(AID): #1HULSzvD (C_and_CPP)