Re: [問題] 陣列名稱&指標常數問題

看板C_and_CPP作者 (boss)時間7年前 (2017/02/02 22:12), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
就我知道的回答一下,雖然不確定是不是你要的答案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://www.ptt.cc/bbs/C_and_CPP/M.1486044746.A.5A5.html
文章代碼(AID): #1OapvAMb (C_and_CPP)
文章代碼(AID): #1OapvAMb (C_and_CPP)