[請益] C語言指標以及陣列index問題

看板Soft_Job作者 (kkk)時間12年前 (2013/09/22 21:24), 編輯推噓0(0028)
留言28則, 2人參與, 最新討論串1/3 (看更多)
大家好, 小弟有一個想不通的疑問 我用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

09/22 21:25, , 1F
第3行改為 str[0]=*(p+1)
09/22 21:25, 1F

09/22 21:30, , 2F
打錯了,是str[0]=*(p++)
09/22 21:30, 2F

09/22 21:31, , 3F
因為原來你加到的東西是指向字串的起始字元
09/22 21:31, 3F

09/22 21:34, , 4F
原來的字串語意等於是str[0]=(*p)++;
09/22 21:34, 4F

09/22 21:35, , 5F
改為str[0]=*(p++);應該就沒問題了 愛用括號包你不會錯
09/22 21:35, 5F

09/22 21:37, , 6F
謝謝您的回答,可是p[1]和p[2]要如何解釋呢?
09/22 21:37, 6F

09/22 21:39, , 7F
事實上原來你的版本意圖把p指標加上一(p=p+1)
09/22 21:39, 7F

09/22 21:40, , 8F
然而你錯把(*p)=(*p)+1 所以p指標本身並沒有p=p+1
09/22 21:40, 8F

09/22 21:43, , 9F

09/22 21:44, , 10F
事實上會先assigh給str[0],再對p加1,這部分我沒有疑問
09/22 21:44, 10F

09/22 21:45, , 11F
比較怪的是對p取index會有奇怪的結果,例:p[1],p[2]...
09/22 21:45, 11F

09/22 21:49, , 12F
假設各有char * a,e,i,o分別指向原始的四個字串
09/22 21:49, 12F

09/22 21:52, , 13F
第二行時*p == a 第三行 str[0]其實就是a本身,指回a自己
09/22 21:52, 13F

09/22 21:52, , 14F
第三行 (*p)變到e
09/22 21:52, 14F

09/22 21:55, , 15F
第四行,str[1]也就是e,改指向(e+1)也就是i 此時*(p)為i
09/22 21:55, 15F

09/22 21:56, , 16F
打錯,是*((str+1)+1) 不是e+1
09/22 21:56, 16F

09/22 21:57, , 17F
第四行結束 str內為 { a i i o }
09/22 21:57, 17F

09/22 21:58, , 18F
第四行結束時, p指向str+1,也就是從e開始
09/22 21:58, 18F

09/22 21:58, , 19F
指向e, (*p) == e
09/22 21:58, 19F

09/22 22:00, , 20F
原本e的位置,目前是i
09/22 22:00, 20F

09/22 22:02, , 21F
第五行,原本i的指標改指向*(p+1)+3,就是*((str+1)+1)+3
09/22 22:02, 21F

09/22 22:04, , 22F
第六行,*(str+3)改指向*(p) 也就是*(str+1),就是指向i字
09/22 22:04, 22F

09/22 22:06, , 23F
到最後str的內容是{ a i i+3 i} 而p的內容等於{i i+3 i}
09/22 22:06, 23F

09/22 22:08, , 24F
因為p等於str+1
09/22 22:08, 24F

09/22 22:09, , 25F
大概解決....可能畫圖比較快理解
09/22 22:09, 25F

09/22 22:10, , 26F
另外1~8F的回答你不用理我XD 我當時理解錯誤
09/22 22:10, 26F

09/22 22:15, , 27F
原來是我沒有考慮到str的內容的變化...@@
09/22 22:15, 27F

09/22 22:16, , 28F
太感謝了,這題目有陷阱...
09/22 22:16, 28F
文章代碼(AID): #1IFkzmhI (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1IFkzmhI (Soft_Job)