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

作者: i78524 (Shulei)   2014-11-26 01:22:04
一開始請大家看個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]數值是一樣的觀念,真是慚愧
還請各位幫忙,感恩。
作者: PoorLoser (廢文製造機)   2014-11-26 01:43:00
記得最近才有人問, &a 跟 a 是同一個記憶體 "位址"不然會陷入 位址的位址的位址的位址的... ...a[i] 取值 等效於 *(a+i)下面那個網頁說得是二維陣列, 你好像搞錯什麼了...
作者: putumaxally (putumaxally)   2014-11-26 05:06:00
陣列可以用指標的方法來操作,不代表陣列等於指標你給的網站是二維陣列,你舉的a是一維陣列,然後你說他是指標變數,你應該是看太多東西搞混了一維陣列的位址跟第一個值的位址是一樣的,[]裡面的數字代表位移量。二維陣列就是在一維陣列裡面在放一個一維陣列,所以痾,上面這句我好像說錯了...
作者: purpose (秀才遇到肥宅兵)   2014-11-26 07:32:00
你仔細看旗標那的第一行,有一個作者刻意設定出來的名詞>> 陣列的名稱是一個指向陣列位址的『指標常數』>> 『指標常數』的位址等於『指標常數』的內容
作者: LPH66 (-6.2598534e+18f)   2014-11-26 13:51:00
他把 num / num[0] 畫一個格子讓你誤會了實際上 1000 這值是綁在 num 這符號上的, 在做位移運算時(例如計算 num[1] 的位址等) 會把這個 1000 直接代入運算式也就是說 1000 這個值不是記在記憶體裡而是直接代入運算在編譯完的程式裡已經沒有"num"這個名字, 而是變成"位址在1000 那裡的陣列",要說的話這才是1000這值"記錄在"的地方
作者: dirkc (3781615)   2014-11-26 16:45:00
你認為的11是對的,但是你要說的是2686755而非26867525吧
作者: purpose (秀才遇到肥宅兵)   2014-11-26 19:56:00
編譯器自己會有一塊記憶體,裡面記載 num 是二維陣列int [3][4] 起始位址是 1000,所以運算式中出現 num 時編譯器從他自己那塊記憶體去做查詢,查到 1000 這個值編譯器的那塊記憶體,在程式編譯完後就丟掉了,所以你寫&num 下去編譯器也不會鳥你,會硬回傳 1000 這個值至於 num[1] 的等價運算式是 *(num + 1),根據指標運算的規則,就是要跳 sizeof(int) * 4,是從 num 推導得來。有興趣的話,可以看看置底文,還有爬文找我寫的混沌四神雖然我寫得不太通順,但可以提供一點額外資訊

Links booklink

Contact Us: admin [ a t ] ucptt.com