作者boss0405 (boss)
看板C_and_CPP
標題Re: [問題] 陣列名稱&指標常數問題
時間Thu Feb 2 22:12:24 2017
就我知道的回答一下,雖然不確定是不是你要的答案XD
如果我認知有錯的話也麻煩大家指教互相交流一下~
※ 引述《anoymouse (沒有暱稱)》之銘言:
: 關於"陣列名稱的位址"跟"陣列第一個元素的位址"相同但值不同的問題
: &name=0x0000 &name[0]=0x0000
: name =0x0000 name[0]=1
name ==> 就是name所在的位址,取值時可用*(name+0),和指標稍微不同的是
如果compiler看到name是陣列那dereference就不會做,會直接從name+0取值,
其實這也算好理解,因為name代表的已經是陣列位址了,所以再作dereference
也沒有意義
&name[0] ==> name[0]這個元素的位址,因為剛好在第一個所以位址會和name相同
&name ==> 這比較容易混淆,因為name事實上是陣列,陣列名稱代表的是位址,
而指標代表的則是位址的位址,雖然使用上可以相同,但意義上有點不同,所以
當compiler看到&name就會看成name(其實就和dereference一樣name再作&沒有意義),
不過因為和name的type不同,所以如果+1後會和name+1得到不同的結果
name[0] ==> compiler會直接看成*(name+0)
: 在板上只看到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), 來自: 125.231.26.52
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1486044746.A.5A5.html