看板 Soft_Job 關於我們 聯絡資訊
※ 引述《kkkmode (kkk)》之銘言: : 大家好, : 小弟有一個想不通的疑問 : 我用Dev-C++編譯下列程式碼 : 一直想不透問何p[1]=lmn : char *str[]={"abcd","efg12","ijklmn","opqrstv"}; : char **p=str; : str[0]=*p++; // *str[]={"abcd","efg12","ijklmn","opqrstv"}; // p = &str[1] : str[1]=*(p+1); // *str[]={"abcd","ijklmn","ijklmn","opqrstv"}; // p = &str[1]; : str[2]=p[1]+3; // *str[]={"abcd","ijklmn","lmn","opqrstv"}; // p = &str[1]; : str[3]=p[0]; // *str[]={"abcd","ijklmn","lmn","ijklmn"}; // p = &str[1] : printf("%s\n",p[0]); => ijklmn p[0]和p應該是相同的位置 // p[0] == str[1] : printf("%s\n",p[1]); => lmn , p[1]有意義?? // p[1] == str[2] : printf("%s\n",p[2]); => ijklmn, p[2]有意義?? // p[2] == str[3] : 若把str[2]=p[1]+3;改成str[2]=p[1]+2; 結果會變成=> : ijklmn : klmn , 應該是影響str[2],為何會影響到p[1] : ijklmn : 事實上p[1]和p[2]應該都沒意義吧?(還是另有別意...小弟不才) : 請問這要如何解釋呢? 我是活體debuger~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.21.188
typepeter:推 09/22 22:16
typepeter:人腦compiler 09/22 22:16
kkkmode:希望有天我也可以人腦compiler...>< 09/22 22:18
realmeat:其實用位址表示會更好~ 因為都指到同一區塊去了 09/22 22:31
Recorder:為什麼str[0]的內容沒有被改掉呢@@? 09/23 00:34
abysses:因為先str[0]=*p之後才做p++ 09/23 00:37
Recorder:是因為引用的priority比++前面這樣嗎? 09/23 00:40
sidney78:++先 09/23 04:13
abysses:++大於*沒錯,但是是後置式的關係,所以會留在後面做 09/23 06:11
Recorder:感謝 09/23 07:14
opadro:推推 09/23 08:48
kuangs:想請問一下 ++大於 * 那以這個例子來說 如何才會使++先做?? 09/23 11:30
qoozxc789:++p? 09/23 15:19
abysses:*(p++) 09/23 19:49
abysses:或者*++p 09/23 19:50
ah7675:*(p++)會先做嗎?? 09/23 19:59
abysses:忽然這麼一說我也懷疑我自己了 09/23 20:02
abysses:不好意思誤導了~ *(p++)的++也會後面做~~ 感謝提醒 09/23 20:56
kkkmode:++先做沒錯,所以*p++=*(p++),只是*p會先assign給str[0] 09/23 20:59
kkkmode:p再加1,所以str[0]的內容不變 09/23 21:00
suscym: 在下新人 不大懂為何要用**p = str,而不是用單指標*p=st 09/23 23:51
typepeter:樓上在說第二行嗎? 第二行那是宣告型態: char **p=str 09/24 00:01
typepeter:(char **) 是一個型態 而這個型態的p其值為str的值 09/24 00:03
kuangs:Sorry 我有個疑問 我看了樓上幾位的解說 產生了疑問 09/24 10:24
kuangs:第四行 str[1]=*(p+1) 那應該不會改到str[1] 的值阿?? 09/24 10:25
kuangs:*(p+1) 不是等於 *p++ 嗎?? 新人問題有錯請糾正 感謝!! 09/24 10:26
genius945:str[1]=*(p+1); 是把等號右邊的assign給左邊的 09/24 11:56
suscym:抱歉 type大 我是想說為何不用char *p = str就好呢? 09/24 16:42
suscym:我的腦筋會有點轉不過來 是要想成指標str裡面又是一個指標 09/24 16:44
suscym:所以才要雙重指標char **p來指向嗎? 09/24 16:44
suscym:謝謝 09/24 16:44
suscym:是說如果我用char *p=str 就只有只像他的起始位置 無法做 09/24 16:45
suscym:陣列式存取是嗎? 09/24 16:45
typepeter:不是吧, str的型態是char *[] 近乎等同於char **耶? 09/24 20:53
typepeter:str本身是指向連續四個位置的指標的開頭 09/24 20:54
typepeter:而被str指向的指標,則是指向一個字串的開頭 09/24 20:55
typepeter:這樣寫和原文寫法是等價的: char *a="abcd"; 09/24 20:56
typepeter:char *e = "efgh"; char *i = "ijklmn"; 09/24 20:56
typepeter:char *o = "opqrstv"; char *str[] = {a,e,i,o}; 09/24 20:58
typepeter:str的型態是:一個指向 (指向字串開始字元指標) 的指標 09/24 20:59
typepeter:在C裡面,陣列幾乎等同於靜態指標,只差在不能指向別位址 09/24 21:01
typepeter:建議可以上網找找看關鍵字--> C語言 array pointer 09/24 21:02
realmeat:@suscym,如果你要瘋狂轉型態也沒啥不可以的, 這就是c, XD 09/25 06:09
realmeat:其實我不是很建議寫這種語意模糊的程式碼 09/25 06:11
realmeat:程式寫作上還有另一個重要點,就是要容易讀,這樣才好維護 09/25 06:12
realmeat:過度賣弄技巧過了三個月再回頭review你就嘗到苦果 (笑 09/25 06:14
suscym:感謝兩位前輩的解答~有時會被*****弄昏頭 09/25 15:02