→ tinlans:先灌輸個正確觀念。C 印指標用 %p,C++ 是轉 (void *)。 05/10 13:16
→ kingofsdtw:115永遠是115,重點是內容形態 和 內容 //指int 和154 05/10 13:22
→ kingofsdtw:嘗試建立struct aa{int y;double z;} 了解 aa *p的意義 05/10 13:24
※ 編輯: DJWS 來自: 59.115.154.196 (05/10 13:46)
→ DJWS:謝謝tinlans,我改好了,現在應該可以開始回答問題了。 :) 05/10 13:47
→ DJWS:kingofsdtw你所說的跟這個問題有什麼關係? 我看不懂... @@" 05/10 13:50
推 ilovebbs:啥是115永遠是115..囧? 看不懂kingofsdtw在說啥.. 05/10 14:19
※ 編輯: DJWS 來自: 59.115.154.196 (05/10 14:22)
→ kingofsdtw:Part 2本來想寫malloc ...但是要翻書帶高手補充.. 05/10 14:57
→ DJWS:為什麼我覺得這段程式碼並非是在解答我的問題... 05/10 15:05
推 kingofsdtw:因為a被宣告時系統就給了位址,永遠都是那位址!除非del 05/10 15:08
→ kingofsdtw:能改變的只有a的指向內容 05/10 15:08
→ kingofsdtw:所以範例程式中 p和 &p 位址永遠固定 05/10 15:10
→ DJWS:嗯嗯,我正是要問為什麼a和&a會一樣。 05/10 15:11
→ kingofsdtw:但是p的內容 [ ] 可以改變,而且跳一格是sizeof(a) 05/10 15:12
→ tinlans:你的問題單純是程式語言的規定,這是我沒針對它回的原因。 05/10 15:14
→ kingofsdtw:>當你宣告一個ptr,不論是int,double,struct ;就只是個 05/10 15:14
推 VictorTom:那是自然的, 想想 int a; 與 int a[10]; a可能佔用記憶 05/10 15:14
→ kingofsdtw:名稱~ 但是OS還是要給這名稱 位址 05/10 15:14
→ joefaq:k大應該沒看懂原PO問題 05/10 15:14
→ VictorTom:體 0x00010000 開始的4 byte, a[10] 就是佔40 byte. 05/10 15:15
→ VictorTom:這時候, &a[0] 自然也是在 0x00010000 的位址上.... 05/10 15:15
→ VictorTom:而a並非指標變數, 所以沒有自己另一個位址, 因此這裡就 05/10 15:16
→ VictorTom:會直接讓 a, &a, &a[0], 都在同一個位址上, 以上面推 05/10 15:16
→ VictorTom:的例子來說就是 0x00010000 的位址:) 05/10 15:17
→ DJWS:原來是規定...那我換個方式問好了,一個int[3][2]型態的變數a 05/10 15:17
→ DJWS:(可能不是變數),在前面加上&之後會有什麼作用? 05/10 15:17
→ DJWS:例如我宣告一個陣列 int a[3][2]; ,那麼&a到底做了什麼事情? 05/10 15:19
→ kingofsdtw:int *a=(int*)malloc(3*2*sizeof(int)); =>&a==a[0][0] 05/10 15:21
→ tinlans:你對陣列做 & 得到的是指向整個陣列的指標,所以對它做 05/10 15:24
→ tinlans:算術運算,每 + 1 就會飛過整個陣列,不管它是幾維。 05/10 15:24
→ tinlans:int a[3][2]; <--- 假設這是 3 x 2 x 4-byte = 24 bytes 05/10 15:26
→ tinlans:int (*ptr)[3][2] = &a; 05/10 15:27
→ DJWS:那a本身(如果不decay成pointer的話)究竟是什麼東西? 05/10 15:27
→ tinlans:a + 1 就是一次飛過那 24 bytes。 05/10 15:27
→ tinlans:a 本身,就是你直接寫出來的那個 type,它懂得陣列的內部 05/10 15:28
→ tinlans:組成,所以可以用那個名稱來尋訪陣列內容。 05/10 15:29
→ tinlans:int a[3][2] 就是說 a 是一個 3 x 2 的 二維 int 陣列。 05/10 15:30
→ tinlans:你可能覺得這答案很無聊,但你問的就是這麼簡單的東西。 05/10 15:30
→ tinlans:compiler 就是這麼單純,你寫什麼就忠實反映出什麼, 05/10 15:30
→ tinlans:你說 a 是什麼,那 a 當然就是什麼。 05/10 15:31
→ tinlans:[3][2] 這種陣列結構就是兩個兩個的東西擺三次,書上應該 05/10 15:34
→ DJWS:原來是這樣! 感謝tinlans。 (應是ptr + 1飛過 24 byte?) 05/10 15:34
→ tinlans:也有教過 compiler 其實不記最左邊那個維度, 05/10 15:35
→ tinlans:所以會是跟 (int *)[2] 這種東西對應。 05/10 15:35
→ tinlans:對,打錯字了,ptr + 1 飛過 24 bytes 才對。 05/10 15:36
→ DJWS:嗯嗯..我以為是a以經decay成(int*)[2],所以a+1才跳8byte。 05/10 15:37
→ DJWS:謝謝你我理解了! (我推文太慢了 XD) 05/10 15:38
→ tinlans:a + 1 實際上發生的事情是 a 從陣列轉換成指標,才做 + 1 05/10 15:41
→ tinlans:,但是你沒這麼做的時候,a 一直都是一個叫陣列的東西。 05/10 15:42