[問題] array / pointer to array

看板C_and_CPP (C/C++)作者 (...)時間16年前 (2010/05/10 13:08), 編輯推噓4(4046)
留言50則, 6人參與, 最新討論串1/2 (看更多)
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

05/10 13:16, , 1F
先灌輸個正確觀念。C 印指標用 %p,C++ 是轉 (void *)。
05/10 13:16, 1F

05/10 13:22, , 2F
115永遠是115,重點是內容形態 和 內容 //指int 和154
05/10 13:22, 2F

05/10 13:24, , 3F
嘗試建立struct aa{int y;double z;} 了解 aa *p的意義
05/10 13:24, 3F
※ 編輯: DJWS 來自: 59.115.154.196 (05/10 13:46)

05/10 13:47, , 4F
謝謝tinlans,我改好了,現在應該可以開始回答問題了。 :)
05/10 13:47, 4F

05/10 13:50, , 5F
kingofsdtw你所說的跟這個問題有什麼關係? 我看不懂... @@"
05/10 13:50, 5F

05/10 14:19, , 6F
啥是115永遠是115..囧? 看不懂kingofsdtw在說啥..
05/10 14:19, 6F
※ 編輯: DJWS 來自: 59.115.154.196 (05/10 14:22)

05/10 14:56, , 7F

05/10 14:57, , 8F
Part 2本來想寫malloc ...但是要翻書帶高手補充..
05/10 14:57, 8F

05/10 15:04, , 9F
http://nopaste.csie.org/97cd7 修正一個小補充 *p位址
05/10 15:04, 9F

05/10 15:05, , 10F
為什麼我覺得這段程式碼並非是在解答我的問題...
05/10 15:05, 10F

05/10 15:08, , 11F
因為a被宣告時系統就給了位址,永遠都是那位址!除非del
05/10 15:08, 11F

05/10 15:08, , 12F
能改變的只有a的指向內容
05/10 15:08, 12F

05/10 15:10, , 13F
所以範例程式中 p和 &p 位址永遠固定
05/10 15:10, 13F

05/10 15:11, , 14F
嗯嗯,我正是要問為什麼a和&a會一樣。
05/10 15:11, 14F

05/10 15:12, , 15F
但是p的內容 [ ] 可以改變,而且跳一格是sizeof(a)
05/10 15:12, 15F

05/10 15:14, , 16F
你的問題單純是程式語言的規定,這是我沒針對它回的原因。
05/10 15:14, 16F

05/10 15:14, , 17F
>當你宣告一個ptr,不論是int,double,struct ;就只是個
05/10 15:14, 17F

05/10 15:14, , 18F
那是自然的, 想想 int a; 與 int a[10]; a可能佔用記憶
05/10 15:14, 18F

05/10 15:14, , 19F
名稱~ 但是OS還是要給這名稱 位址
05/10 15:14, 19F

05/10 15:14, , 20F
k大應該沒看懂原PO問題
05/10 15:14, 20F

05/10 15:15, , 21F
體 0x00010000 開始的4 byte, a[10] 就是佔40 byte.
05/10 15:15, 21F

05/10 15:15, , 22F
這時候, &a[0] 自然也是在 0x00010000 的位址上....
05/10 15:15, 22F

05/10 15:16, , 23F
而a並非指標變數, 所以沒有自己另一個位址, 因此這裡就
05/10 15:16, 23F

05/10 15:16, , 24F
會直接讓 a, &a, &a[0], 都在同一個位址上, 以上面推
05/10 15:16, 24F

05/10 15:17, , 25F
的例子來說就是 0x00010000 的位址:)
05/10 15:17, 25F

05/10 15:17, , 26F
原來是規定...那我換個方式問好了,一個int[3][2]型態的變數a
05/10 15:17, 26F

05/10 15:17, , 27F
(可能不是變數),在前面加上&之後會有什麼作用?
05/10 15:17, 27F

05/10 15:19, , 28F
例如我宣告一個陣列 int a[3][2]; ,那麼&a到底做了什麼事情?
05/10 15:19, 28F

05/10 15:21, , 29F
int *a=(int*)malloc(3*2*sizeof(int)); =>&a==a[0][0]
05/10 15:21, 29F

05/10 15:24, , 30F
你對陣列做 & 得到的是指向整個陣列的指標,所以對它做
05/10 15:24, 30F

05/10 15:24, , 31F
算術運算,每 + 1 就會飛過整個陣列,不管它是幾維。
05/10 15:24, 31F

05/10 15:26, , 32F
int a[3][2]; <--- 假設這是 3 x 2 x 4-byte = 24 bytes
05/10 15:26, 32F

05/10 15:27, , 33F
int (*ptr)[3][2] = &a;
05/10 15:27, 33F

05/10 15:27, , 34F
那a本身(如果不decay成pointer的話)究竟是什麼東西?
05/10 15:27, 34F

05/10 15:27, , 35F
a + 1 就是一次飛過那 24 bytes。
05/10 15:27, 35F

05/10 15:28, , 36F
a 本身,就是你直接寫出來的那個 type,它懂得陣列的內部
05/10 15:28, 36F

05/10 15:29, , 37F
組成,所以可以用那個名稱來尋訪陣列內容。
05/10 15:29, 37F

05/10 15:30, , 38F
int a[3][2] 就是說 a 是一個 3 x 2 的 二維 int 陣列。
05/10 15:30, 38F

05/10 15:30, , 39F
你可能覺得這答案很無聊,但你問的就是這麼簡單的東西。
05/10 15:30, 39F

05/10 15:30, , 40F
compiler 就是這麼單純,你寫什麼就忠實反映出什麼,
05/10 15:30, 40F

05/10 15:31, , 41F
你說 a 是什麼,那 a 當然就是什麼。
05/10 15:31, 41F

05/10 15:34, , 42F
[3][2] 這種陣列結構就是兩個兩個的東西擺三次,書上應該
05/10 15:34, 42F

05/10 15:34, , 43F
原來是這樣! 感謝tinlans。 (應是ptr + 1飛過 24 byte?)
05/10 15:34, 43F

05/10 15:35, , 44F
也有教過 compiler 其實不記最左邊那個維度,
05/10 15:35, 44F

05/10 15:35, , 45F
所以會是跟 (int *)[2] 這種東西對應。
05/10 15:35, 45F

05/10 15:36, , 46F
對,打錯字了,ptr + 1 飛過 24 bytes 才對。
05/10 15:36, 46F

05/10 15:37, , 47F
嗯嗯..我以為是a以經decay成(int*)[2],所以a+1才跳8byte。
05/10 15:37, 47F

05/10 15:38, , 48F
謝謝你我理解了! (我推文太慢了 XD)
05/10 15:38, 48F

05/10 15:41, , 49F
a + 1 實際上發生的事情是 a 從陣列轉換成指標,才做 + 1
05/10 15:41, 49F

05/10 15:42, , 50F
,但是你沒這麼做的時候,a 一直都是一個叫陣列的東西。
05/10 15:42, 50F
文章代碼(AID): #1BvvJKEn (C_and_CPP)
文章代碼(AID): #1BvvJKEn (C_and_CPP)