看板 C_and_CPP 關於我們 聯絡資訊
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
sunlights:謝謝..但是還是不懂為什麼我熟悉的*p可以給值但直接指定 11/06 23:08
sunlights:位址卻不能給值..ps:(2)是不是有筆誤.好像是char 11/06 23:09
diabloevagto:好人 11/06 23:48
nightcola:順道請問一下, (4) 跟 (2) 的差異在哪? 11/06 23:48
nightcola:不是都是配 char array 給p 嗎? 謝謝! 11/06 23:49
uranusjr:(4) 是把 scanf 讀入的字串存到 &p 開頭的字元陣列 11/07 00:20
uranusjr:%s 的行為和其他 placeholders 不一樣, 請特別注意 11/07 00:21
legnaleurc:嚴格來說 2 和 6 最後都有機會出錯 11/07 01:41
legnaleurc:應該使用 const char * 11/07 01:41
cuteclare:好人! 11/07 01:59
edan927:真的!亂出櫃會出問題的 !!! 11/07 08:45
※ 編輯: james732 來自: 114.32.92.122 (11/07 09:11)