Re: [問題] 很初級的指標問題

看板C_and_CPP (C/C++)作者 (好人超)時間13年前 (2012/11/06 22:46), 編輯推噓3(308)
留言11則, 7人參與, 最新討論串2/3 (看更多)
int *p; 請想像你拿了一張廢紙,紙上會寫一個亂數 上面這個數字是某個置物櫃號碼 (1) int *p; p = 300; 你在紙上抄了300號置物櫃 但是這個置物櫃並不一定是你的 你只是抄下這個數字,其實並沒有問題 但如果想要 *p = 100; 把 100 這個值塞入 300 號這個櫃子 或者 printf("%d", *p); 想把 300 號這個櫃子的東西拿出來 就不一定是合法的 (2) char *p; p = "abcd"; 這個比較難比喻,因為 compiler 會自動找五個空的櫃子 把 "abcd\0" 塞進去,然後把第一個櫃子的號碼寫在你的紙上 這個動作並沒有問題 (3) int *p; scanf("%d",p); (4) char *p; scanf("%s",p); 你把使用者輸入的東西塞到置物櫃 但這個時候紙上的號碼是亂數 所以根本不知道會塞到哪裡去 這個寫法的問題最大,因為你不知道p這張紙上的數字 所以你的東西不知道會塞到哪裡去 (5) int *p=300; 其實跟 (1) 是一樣的 (6) char *p="test"; 這個跟 (2) 是一樣的 所以你熟悉的 int *p; int i = 0; p = &i; 這種寫法,compiler會先找個空的置物櫃當作i,把0塞進去 再把置物櫃的號碼讓你抄在p上面,這也是合法的 (嚴格來說是sizeof(int)個櫃子...XD) 結論是: int *p; 在這張紙上,你可以隨便填個數字都沒有關係 p = 300; 或什麼值都好 但如果紙上的號碼那個櫃子不是你的 (不管是你亂寫的,還是原本的亂數) 那你去開櫃子就會出問題....XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.67.56.196

11/06 23:08, , 1F
謝謝..但是還是不懂為什麼我熟悉的*p可以給值但直接指定
11/06 23:08, 1F

11/06 23:09, , 2F
位址卻不能給值..ps:(2)是不是有筆誤.好像是char
11/06 23:09, 2F

11/06 23:48, , 3F
好人
11/06 23:48, 3F

11/06 23:48, , 4F
順道請問一下, (4) 跟 (2) 的差異在哪?
11/06 23:48, 4F

11/06 23:49, , 5F
不是都是配 char array 給p 嗎? 謝謝!
11/06 23:49, 5F

11/07 00:20, , 6F
(4) 是把 scanf 讀入的字串存到 &p 開頭的字元陣列
11/07 00:20, 6F

11/07 00:21, , 7F
%s 的行為和其他 placeholders 不一樣, 請特別注意
11/07 00:21, 7F

11/07 01:41, , 8F
嚴格來說 2 和 6 最後都有機會出錯
11/07 01:41, 8F

11/07 01:41, , 9F
應該使用 const char *
11/07 01:41, 9F

11/07 01:59, , 10F
好人!
11/07 01:59, 10F

11/07 08:45, , 11F
真的!亂出櫃會出問題的 !!!
11/07 08:45, 11F
※ 編輯: james732 來自: 114.32.92.122 (11/07 09:11)
文章代碼(AID): #1GcIAxZM (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GcIAxZM (C_and_CPP)