看板 C_and_CPP 關於我們 聯絡資訊
http://c-faq.com/aryptr/aryptrequiv.html 如果我宣告了一個陣列 int a[3][2]; a; // 本來的型態是 int[3][2],編譯器會轉換成 (int*)[2] &a; // 型態是 (int*)[3][2] 我想問的問題是,為什麼a和&a這兩個的數值是相同的(或者為什麼要讓他們相同)? printf("%p", a); // C版本 printf("%p", &a); cout << (void*)a; // C++版本 cout << (void*)&a; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.115.154.196
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:http://nopaste.csie.org/e2296 05/10 14:56
kingofsdtw:Part 2本來想寫malloc ...但是要翻書帶高手補充.. 05/10 14:57
kingofsdtw:http://nopaste.csie.org/97cd7 修正一個小補充 *p位址 05/10 15:04
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