[問題] 陣列、指標與記憶體的概念疑問

看板C_and_CPP作者 (Shulei)時間11年前 (2014/11/26 01:22), 11年前編輯推噓5(5025)
留言30則, 5人參與, 最新討論串1/1
一開始請大家看個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

11/26 01:43, , 1F
記得最近才有人問, &a 跟 a 是同一個記憶體 "位址"
11/26 01:43, 1F

11/26 01:44, , 2F
不然會陷入 位址的位址的位址的位址的... ...
11/26 01:44, 2F

11/26 01:45, , 3F
a[i] 取值 等效於 *(a+i)
11/26 01:45, 3F

11/26 01:48, , 4F
下面那個網頁說得是二維陣列, 你好像搞錯什麼了...
11/26 01:48, 4F

11/26 05:06, , 5F
陣列可以用指標的方法來操作,不代表陣列等於指標
11/26 05:06, 5F

11/26 05:17, , 6F
你給的網站是二維陣列,你舉的a是一維陣列,然後你說
11/26 05:17, 6F

11/26 05:18, , 7F
他是指標變數,你應該是看太多東西搞混了
11/26 05:18, 7F

11/26 05:21, , 8F
一維陣列的位址跟第一個值的位址是一樣的,[]裡面的
11/26 05:21, 8F

11/26 05:23, , 9F
數字代表位移量。
11/26 05:23, 9F

11/26 05:24, , 10F
二維陣列就是在一維陣列裡面在放一個一維陣列,所以
11/26 05:24, 10F

11/26 05:28, , 11F
痾,上面這句我好像說錯了...
11/26 05:28, 11F

11/26 07:32, , 12F
你仔細看旗標那的第一行,有一個作者刻意設定出來的名詞
11/26 07:32, 12F

11/26 07:32, , 13F
>> 陣列的名稱是一個指向陣列位址的『指標常數』
11/26 07:32, 13F

11/26 07:33, , 14F
>> 『指標常數』的位址等於『指標常數』的內容
11/26 07:33, 14F
謝謝樓上三位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

11/26 13:51, , 15F
他把 num / num[0] 畫一個格子讓你誤會了
11/26 13:51, 15F

11/26 13:51, , 16F
實際上 1000 這值是綁在 num 這符號上的, 在做位移運算時
11/26 13:51, 16F

11/26 13:52, , 17F
(例如計算 num[1] 的位址等) 會把這個 1000 直接代入運算式
11/26 13:52, 17F

11/26 13:52, , 18F
也就是說 1000 這個值不是記在記憶體裡而是直接代入運算
11/26 13:52, 18F

11/26 13:55, , 19F
在編譯完的程式裡已經沒有"num"這個名字, 而是變成"位址在
11/26 13:55, 19F

11/26 13:56, , 20F
1000 那裡的陣列",要說的話這才是1000這值"記錄在"的地方
11/26 13:56, 20F

11/26 16:45, , 21F
你認為的11是對的,但是你要說的是2686755而非26867525吧
11/26 16:45, 21F

11/26 19:56, , 22F
編譯器自己會有一塊記憶體,裡面記載 num 是二維陣列
11/26 19:56, 22F

11/26 19:56, , 23F
int [3][4] 起始位址是 1000,所以運算式中出現 num 時
11/26 19:56, 23F

11/26 19:57, , 24F
編譯器從他自己那塊記憶體去做查詢,查到 1000 這個值
11/26 19:57, 24F

11/26 19:58, , 25F
編譯器的那塊記憶體,在程式編譯完後就丟掉了,所以你寫
11/26 19:58, 25F

11/26 19:58, , 26F
&num 下去編譯器也不會鳥你,會硬回傳 1000 這個值
11/26 19:58, 26F

11/26 20:00, , 27F
至於 num[1] 的等價運算式是 *(num + 1),根據指標運算
11/26 20:00, 27F

11/26 20:01, , 28F
的規則,就是要跳 sizeof(int) * 4,是從 num 推導得來。
11/26 20:01, 28F
感謝LPH66與purpose的耐心解釋,這一次我完全弄懂了。 在學習C的時候,我總是挺在意記憶體與編譯器到底怎麼運作的。 因此,我想看到的就是這個層級的解釋。 真的十分謝謝你們! 也十分謝謝dirkc,幫我抓出筆誤(已修正)。 最後感謝所有幫我解惑的網友,感恩! ※ 編輯: i78524 (111.255.146.215), 11/26/2014 22:30:57

11/26 22:50, , 29F
有興趣的話,可以看看置底文,還有爬文找我寫的混沌四神
11/26 22:50, 29F

11/26 22:50, , 30F
雖然我寫得不太通順,但可以提供一點額外資訊
11/26 22:50, 30F
文章代碼(AID): #1KTBg_6H (C_and_CPP)