看板 C_and_CPP 關於我們 聯絡資訊
一開始請大家看個code: http://i.imgur.com/6RD8WK1.jpg?1 在這裡,陣列可以用指標的方法來操作。 由&a得知,指標變數a的"記憶體位址"為:2686752 (十進位) 由 a得知,指標變數a指向的是:2686752 (十進位) 換句話說2686752至26867525這段記憶體位置裡放的應該是數字:2686752 (我的觀念:指標變數是個值,這個值放的是指向的位址) 圖例: ┌這裡放4byte數字2686752┐ |_____|_____|_____|_____| ↑ ↑ ↑ ↑ 6752 6753 6754 6755 取值運算子*a告訴我: (1). a裡面放的數字是2686752 (2). 我去記憶體位址2686752的地方拿數字出來,拿出來的東西是11 (3). 因此,可推敲出"11"這個數值,確實是放在2686752至26867525這段記憶體區間 我的問題來了 但是2686752至26867525這段記憶體區間不是已經放了數字:2686752嗎? 我不太能接受數字11也是放在2686752至26867525這段記憶體區間內啊... 11到底放在記憶體的哪裡呢? 這是個新手問題,但我還是轉不過來,請見諒。 還請各位多多指教與幫忙,真的十分感謝各位。 我是突然看了http://www.flag.com.tw/book/cento-5105.asp?bokno=FS712&id=275 才突然有a[0],&a[0]數值是一樣的觀念,真是慚愧 還請各位幫忙,感恩。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.142.4.66 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416936127.A.191.html ※ 編輯: i78524 (220.142.4.66), 11/26/2014 01:27:13
PoorLoser: 記得最近才有人問, &a 跟 a 是同一個記憶體 "位址" 11/26 01:43
PoorLoser: 不然會陷入 位址的位址的位址的位址的... ... 11/26 01:44
PoorLoser: a[i] 取值 等效於 *(a+i) 11/26 01:45
PoorLoser: 下面那個網頁說得是二維陣列, 你好像搞錯什麼了... 11/26 01:48
putumaxally: 陣列可以用指標的方法來操作,不代表陣列等於指標 11/26 05:06
putumaxally: 你給的網站是二維陣列,你舉的a是一維陣列,然後你說 11/26 05:17
putumaxally: 他是指標變數,你應該是看太多東西搞混了 11/26 05:18
putumaxally: 一維陣列的位址跟第一個值的位址是一樣的,[]裡面的 11/26 05:21
putumaxally: 數字代表位移量。 11/26 05:23
putumaxally: 二維陣列就是在一維陣列裡面在放一個一維陣列,所以 11/26 05:24
putumaxally: 痾,上面這句我好像說錯了... 11/26 05:28
purpose: 你仔細看旗標那的第一行,有一個作者刻意設定出來的名詞 11/26 07:32
purpose: >> 陣列的名稱是一個指向陣列位址的『指標常數』 11/26 07:32
purpose: >> 『指標常數』的位址等於『指標常數』的內容 11/26 07:33
謝謝樓上三位p大的熱心回應。我似乎快要搞懂了 :) 尤其是這句話: 『指標常數』的位址等於『指標常數』的內容 當我在做int a[5] = {11,22,33,44,55}; printf("a = %d",a); 印出來的a是"address 2686752",而不是位址2686752放著"數值 2686752" 確實,旗標網頁講的是2D array的例子,但是這個問題是可以被簡化為1D來討論的。 它無關1D與2D,它比較關係到array他在記憶體怎麼實作的問題。 再換個方式來問好了: 我們把層級拉低到記憶體來看 對於我所提出的例子,在記憶體區段2686752至2686755之中,它到底放了什麼數值? 我想了解記憶體真正紀錄的數值,謝謝大家(鞠躬)。 (我自己傾向是"11") ps. 這篇文章中是什麼東西讓我一直鬼打牆呢? 我想可以以下圖和大家說明(圖節錄至網頁): http://i.imgur.com/u2CBde1.jpg (我不能接受記憶體區間1000的地方同時紀錄著『1000』與『12』這兩個數值!!!) ※ 編輯: i78524 (111.255.146.215), 11/26/2014 13:05:34
LPH66: 他把 num / num[0] 畫一個格子讓你誤會了 11/26 13:51
LPH66: 實際上 1000 這值是綁在 num 這符號上的, 在做位移運算時 11/26 13:51
LPH66: (例如計算 num[1] 的位址等) 會把這個 1000 直接代入運算式 11/26 13:52
LPH66: 也就是說 1000 這個值不是記在記憶體裡而是直接代入運算 11/26 13:52
LPH66: 在編譯完的程式裡已經沒有"num"這個名字, 而是變成"位址在 11/26 13:55
LPH66: 1000 那裡的陣列",要說的話這才是1000這值"記錄在"的地方 11/26 13:56
dirkc: 你認為的11是對的,但是你要說的是2686755而非26867525吧 11/26 16:45
purpose: 編譯器自己會有一塊記憶體,裡面記載 num 是二維陣列 11/26 19:56
purpose: int [3][4] 起始位址是 1000,所以運算式中出現 num 時 11/26 19:56
purpose: 編譯器從他自己那塊記憶體去做查詢,查到 1000 這個值 11/26 19:57
purpose: 編譯器的那塊記憶體,在程式編譯完後就丟掉了,所以你寫 11/26 19:58
purpose: &num 下去編譯器也不會鳥你,會硬回傳 1000 這個值 11/26 19:58
purpose: 至於 num[1] 的等價運算式是 *(num + 1),根據指標運算 11/26 20:00
purpose: 的規則,就是要跳 sizeof(int) * 4,是從 num 推導得來。 11/26 20:01
感謝LPH66與purpose的耐心解釋,這一次我完全弄懂了。 在學習C的時候,我總是挺在意記憶體與編譯器到底怎麼運作的。 因此,我想看到的就是這個層級的解釋。 真的十分謝謝你們! 也十分謝謝dirkc,幫我抓出筆誤(已修正)。 最後感謝所有幫我解惑的網友,感恩! ※ 編輯: i78524 (111.255.146.215), 11/26/2014 22:30:57
purpose: 有興趣的話,可以看看置底文,還有爬文找我寫的混沌四神 11/26 22:50
purpose: 雖然我寫得不太通順,但可以提供一點額外資訊 11/26 22:50