看板 Soft_Job 關於我們 聯絡資訊
大家好, 小弟有一個想不通的疑問 我用Dev-C++編譯下列程式碼 一直想不透問何p[1]=lmn char *str[]={"abcd","efg12","ijklmn","opqrstv"}; char **p=str; str[0]=*p++; str[1]=*(p+1); str[2]=p[1]+3; str[3]=p[0]; printf("%s\n",p[0]); => ijklmn p[0]和p應該是相同的位置 printf("%s\n",p[1]); => lmn , p[1]有意義?? printf("%s\n",p[2]); => ijklmn, p[2]有意義?? 若把str[2]=p[1]+3;改成str[2]=p[1]+2; 結果會變成=> ijklmn klmn , 應該是影響str[2],為何會影響到p[1] ijklmn 事實上p[1]和p[2]應該都沒意義吧?(還是另有別意...小弟不才) 請問這要如何解釋呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.24.53.68
typepeter:第3行改為 str[0]=*(p+1) 09/22 21:25
typepeter:打錯了,是str[0]=*(p++) 09/22 21:30
typepeter:因為原來你加到的東西是指向字串的起始字元 09/22 21:31
typepeter:原來的字串語意等於是str[0]=(*p)++; 09/22 21:34
typepeter:改為str[0]=*(p++);應該就沒問題了 愛用括號包你不會錯 09/22 21:35
kkkmode:謝謝您的回答,可是p[1]和p[2]要如何解釋呢? 09/22 21:37
typepeter:事實上原來你的版本意圖把p指標加上一(p=p+1) 09/22 21:39
typepeter:然而你錯把(*p)=(*p)+1 所以p指標本身並沒有p=p+1 09/22 21:40
kkkmode:請參考http://www.wretch.cc/blog/easy7161/11986541 09/22 21:43
kkkmode:事實上會先assigh給str[0],再對p加1,這部分我沒有疑問 09/22 21:44
kkkmode:比較怪的是對p取index會有奇怪的結果,例:p[1],p[2]... 09/22 21:45
typepeter:假設各有char * a,e,i,o分別指向原始的四個字串 09/22 21:49
typepeter:第二行時*p == a 第三行 str[0]其實就是a本身,指回a自己 09/22 21:52
typepeter:第三行 (*p)變到e 09/22 21:52
typepeter:第四行,str[1]也就是e,改指向(e+1)也就是i 此時*(p)為i 09/22 21:55
typepeter: 打錯,是*((str+1)+1) 不是e+1 09/22 21:56
typepeter:第四行結束 str內為 { a i i o } 09/22 21:57
typepeter:第四行結束時, p指向str+1,也就是從e開始 09/22 21:58
typepeter: 指向e, (*p) == e 09/22 21:58
typepeter: 原本e的位置,目前是i 09/22 22:00
typepeter:第五行,原本i的指標改指向*(p+1)+3,就是*((str+1)+1)+3 09/22 22:02
typepeter:第六行,*(str+3)改指向*(p) 也就是*(str+1),就是指向i字 09/22 22:04
typepeter:到最後str的內容是{ a i i+3 i} 而p的內容等於{i i+3 i} 09/22 22:06
typepeter:因為p等於str+1 09/22 22:08
typepeter:大概解決....可能畫圖比較快理解 09/22 22:09
typepeter:另外1~8F的回答你不用理我XD 我當時理解錯誤 09/22 22:10
kkkmode:原來是我沒有考慮到str的內容的變化...@@ 09/22 22:15
kkkmode:太感謝了,這題目有陷阱... 09/22 22:16