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

看板Soft_Job (軟體人)作者 (真肉)時間12年前 (2013/09/22 22:15), 編輯推噓18(18029)
留言47則, 12人參與, 最新討論串3/3 (看更多)
※ 引述《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

09/22 22:16, , 1F
09/22 22:16, 1F

09/22 22:16, , 2F
人腦compiler
09/22 22:16, 2F

09/22 22:18, , 3F
希望有天我也可以人腦compiler...><
09/22 22:18, 3F

09/22 22:31, , 4F
其實用位址表示會更好~ 因為都指到同一區塊去了
09/22 22:31, 4F

09/23 00:34, , 5F
為什麼str[0]的內容沒有被改掉呢@@?
09/23 00:34, 5F

09/23 00:37, , 6F
因為先str[0]=*p之後才做p++
09/23 00:37, 6F

09/23 00:40, , 7F
是因為引用的priority比++前面這樣嗎?
09/23 00:40, 7F

09/23 04:13, , 8F
++先
09/23 04:13, 8F

09/23 06:11, , 9F
++大於*沒錯,但是是後置式的關係,所以會留在後面做
09/23 06:11, 9F

09/23 07:14, , 10F
感謝
09/23 07:14, 10F

09/23 08:48, , 11F
推推
09/23 08:48, 11F

09/23 11:30, , 12F
想請問一下 ++大於 * 那以這個例子來說 如何才會使++先做??
09/23 11:30, 12F

09/23 15:19, , 13F
++p?
09/23 15:19, 13F

09/23 19:49, , 14F
*(p++)
09/23 19:49, 14F

09/23 19:50, , 15F
或者*++p
09/23 19:50, 15F

09/23 19:59, , 16F
*(p++)會先做嗎??
09/23 19:59, 16F

09/23 20:02, , 17F
忽然這麼一說我也懷疑我自己了
09/23 20:02, 17F

09/23 20:56, , 18F
不好意思誤導了~ *(p++)的++也會後面做~~ 感謝提醒
09/23 20:56, 18F

09/23 20:59, , 19F
++先做沒錯,所以*p++=*(p++),只是*p會先assign給str[0]
09/23 20:59, 19F

09/23 21:00, , 20F
p再加1,所以str[0]的內容不變
09/23 21:00, 20F

09/23 23:51, , 21F
在下新人 不大懂為何要用**p = str,而不是用單指標*p=st
09/23 23:51, 21F

09/24 00:01, , 22F
樓上在說第二行嗎? 第二行那是宣告型態: char **p=str
09/24 00:01, 22F

09/24 00:03, , 23F
(char **) 是一個型態 而這個型態的p其值為str的值
09/24 00:03, 23F

09/24 10:24, , 24F
Sorry 我有個疑問 我看了樓上幾位的解說 產生了疑問
09/24 10:24, 24F

09/24 10:25, , 25F
第四行 str[1]=*(p+1) 那應該不會改到str[1] 的值阿??
09/24 10:25, 25F

09/24 10:26, , 26F
*(p+1) 不是等於 *p++ 嗎?? 新人問題有錯請糾正 感謝!!
09/24 10:26, 26F

09/24 11:56, , 27F
str[1]=*(p+1); 是把等號右邊的assign給左邊的
09/24 11:56, 27F

09/24 16:42, , 28F
抱歉 type大 我是想說為何不用char *p = str就好呢?
09/24 16:42, 28F

09/24 16:44, , 29F
我的腦筋會有點轉不過來 是要想成指標str裡面又是一個指標
09/24 16:44, 29F

09/24 16:44, , 30F
所以才要雙重指標char **p來指向嗎?
09/24 16:44, 30F

09/24 16:44, , 31F
謝謝
09/24 16:44, 31F

09/24 16:45, , 32F
是說如果我用char *p=str 就只有只像他的起始位置 無法做
09/24 16:45, 32F

09/24 16:45, , 33F
陣列式存取是嗎?
09/24 16:45, 33F

09/24 20:53, , 34F
不是吧, str的型態是char *[] 近乎等同於char **耶?
09/24 20:53, 34F

09/24 20:54, , 35F
str本身是指向連續四個位置的指標的開頭
09/24 20:54, 35F

09/24 20:55, , 36F
而被str指向的指標,則是指向一個字串的開頭
09/24 20:55, 36F

09/24 20:56, , 37F
這樣寫和原文寫法是等價的: char *a="abcd";
09/24 20:56, 37F

09/24 20:56, , 38F
char *e = "efgh"; char *i = "ijklmn";
09/24 20:56, 38F

09/24 20:58, , 39F
char *o = "opqrstv"; char *str[] = {a,e,i,o};
09/24 20:58, 39F

09/24 20:59, , 40F
str的型態是:一個指向 (指向字串開始字元指標) 的指標
09/24 20:59, 40F

09/24 21:01, , 41F
在C裡面,陣列幾乎等同於靜態指標,只差在不能指向別位址
09/24 21:01, 41F

09/24 21:02, , 42F
建議可以上網找找看關鍵字--> C語言 array pointer
09/24 21:02, 42F

09/25 06:09, , 43F
@suscym,如果你要瘋狂轉型態也沒啥不可以的, 這就是c, XD
09/25 06:09, 43F

09/25 06:11, , 44F
其實我不是很建議寫這種語意模糊的程式碼
09/25 06:11, 44F

09/25 06:12, , 45F
程式寫作上還有另一個重要點,就是要容易讀,這樣才好維護
09/25 06:12, 45F

09/25 06:14, , 46F
過度賣弄技巧過了三個月再回頭review你就嘗到苦果 (笑
09/25 06:14, 46F

09/25 15:02, , 47F
感謝兩位前輩的解答~有時會被*****弄昏頭
09/25 15:02, 47F
文章代碼(AID): #1IFlkQ1R (Soft_Job)
文章代碼(AID): #1IFlkQ1R (Soft_Job)