看板 C_and_CPP 關於我們 聯絡資訊
關於"陣列名稱的位址"跟"陣列第一個元素的位址"相同但值不同的問題 &name=0x0000 &name[0]=0x0000 name =0x0000 name[0]=1 在板上只看到LPH66大的回文,其實看不太懂 上網看大部分的解釋大概是說: 如果有一個陣列int name[3]={1,2,3}, &name[0]=0x0000 &name[1]=0x0004 &name[2]=0x0008 其陣列名稱name是一個指向陣列第一個元素的位址的指標,也就是指標常數 name=0x0000 name+1=0x0004 name+2=0x0008 如果陣列名稱name碰到兩個operator:sizeof() or & 變成&name就會是指到整個陣列的位址,所以&name+1就會變成0x000C 意思是說陣列名稱(指標常數)其實並沒有自身的位址的概念? 如果只是取陣列元素如name[0]那就會自動decay(網路上都用這個詞)成指標 *(name+0) 如果是使用&name那只是純粹得到整個陣列的位址? &name並不是指標常數的位址? 不知道這樣問大家是否看的懂? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.22.77 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1485934980.A.5D8.html
chuegou: 所以&name+1就會變成0x000C <-- 阿??? 02/01 16:09
friends29: (&name)+1 跟 &(name +1) 是不一樣滴 02/01 16:34
friends29: 你把陣列大小改一下 再用同樣的方式列出記憶體位置就會 02/01 17:01
friends29: 懂了 02/01 17:01
anoymouse: &(name+1)編譯不過 name+1本身不是指標常數不能取&吧 02/01 17:39
※ 編輯: anoymouse (118.160.31.81), 02/01/2017 17:40:20
ko27tye: 雖然看不懂你想問什麼不過00~0B都是屬於name的記憶體區塊 02/01 19:40
ko27tye: 但&name不會用00~0B這種表現方式 而是扔給你開頭的位址 02/01 19:42
ko27tye: 所以陣列名稱是一個const pointer 指向陣列的第一個元素 02/01 19:43
就是在問陣列名稱的位址跟第一個元素的位址一樣 可是同一個位址卻有兩個不一樣的值 一個是指到陣列第一個元素的位址,一個是name[0]的內容0
friends29: 講不對去 (name+1)而已 沒有& 02/01 20:11
※ 編輯: anoymouse (118.160.31.81), 02/01/2017 21:42:50
ko27tye: 下標運算 name[k] = *(name+k) 02/01 21:56
ko27tye: 你說有兩個值 因為一個是記憶體位址一個是對位址做*取值 02/01 21:57
ko27tye: 就是指標的概念02/01 21:58
boss0405: 因為type不一樣,你另外定義一個指標去指就知道了02/02 09:46
boss0405: int *b = name可以編但int *b = &name會warning,同理02/02 09:48
boss0405: int (*b)[3] = &name可以編int (*b)[3] = name會warning02/02 09:49
anoymouse: 可是要怎麼解釋兩者物理位址顯示是一樣? 02/02 18:31
boss0405: name代表的是陣列位址name和&name的開頭位址都一樣,只02/02 18:39
boss0405: 是type不一樣而已02/02 18:39
重寫一遍了 發現沒問清楚 ※ 編輯: anoymouse (223.136.67.39), 02/02/2017 19:38:30 ※ 編輯: anoymouse (118.160.31.81), 02/02/2017 20:04:09 ※ 編輯: anoymouse (118.160.31.81), 02/02/2017 21:20:00
Feis: 有人有興趣解釋一下 1[name] 會是甚麼嗎 02/03 02:16
Feis: BTW, 之前有寫過 #1LKmM17A 可以參考一下 02/03 02:43
yvb: 回F大, 好暗黑的 subscripting 等同算式. 即使語意上沒道理. 02/03 09:10