主题:华为经典面试题目,求解
jany65
[专家分:10] 发布于 2010-06-30 11:53:00
int a[]={1,2,3,4,5};
计算*(((int *)&a-1)+3)的值,顺便问下这个写法应该怎样理解?谢谢
回复列表 (共3个回复)
沙发
josephkwok [专家分:530] 发布于 2010-06-30 12:31:00
我覺得,地址也有類型之分,
int a; 那麼 &a 是 int *
int a[5]; 那麼 &a 是 int (*)[5],即指向一個5個元素的整形數組的指針
所以,題中 &a 表示 int(*)[5],再強制轉換為 int * ,
這樣對指針的加減法就是 4 字節而不是 4*5=20 字節.
所以輸出的是3,
可以改寫成*((int *)&a+2)
板凳
雪光风剑 [专家分:27190] 发布于 2010-06-30 21:45:00
1楼其实已经说的差不多了,不过犯了个晕,其实最后的结果就是a[2]
这道题玩了个文字游戏,放了个空枪:
注意,*(((int *)&a-1)+3)里面,第二个括号实际上是可以解开的……因为其实没有改变任何东西
而(int*)&a则是文字游戏的重点所在,对a取地址和a本身的取值实际上是相同的,从单纯的值上看都是&a[0],然后再按照int*解析,实际上就是把数组显式地转化成了int*,后面就是考指针偏移和数组下标之间的对应关系了
3 楼
alweeq86 [专家分:1170] 发布于 2010-07-04 08:18:00
*(((int *)&a-1)+3)
=*((a-1)+3)
=*(a-1+3)
=*(a+2)
=a[2]
我来回复