作者james732 (好人超)
看板C_and_CPP
標題Re: [問題] 很初級的指標問題
時間Tue Nov 6 22:46:16 2012
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)