作者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/cn.aspx?n=bbs/C_and_CPP/M.1486044746.A.5A5.html