黑马程序员技术交流社区

标题: 经典面试题一 [打印本页]

作者: 一丢丢大人    时间: 2015-9-5 22:21
标题: 经典面试题一
1.下面打印出来的结果是什么?

int a[]={1,2,3,4,5};

int *p=(int*)(&a+1);

printf("%d,%d\n",*(a+1),*(p-1));




思路: int *p=&a+1;*(a+1)==2   p=&a+1

作者: hoohoo    时间: 2015-9-5 22:47
2,5   right

作者: 一丢丢大人    时间: 2015-9-5 22:49
hoohoo 发表于 2015-9-5 22:47
2,5   right

right,够速度
作者: 张健康ios0826    时间: 2015-9-5 23:34
2    ,     5
作者: kylmetz    时间: 2015-9-5 23:37
这个 不是今天刚讲过吗?
作者: 胥鹏飞    时间: 2015-9-6 00:43
为什么是2,5
作者: 一丢丢大人    时间: 2015-9-6 08:35
kylmetz 发表于 2015-9-5 23:37
这个 不是今天刚讲过吗?

是啊!但还是要自己过一遍思路才记得牢
作者: 一丢丢大人    时间: 2015-9-6 08:36
kylmetz 发表于 2015-9-5 23:37
这个 不是今天刚讲过吗?

是啊!但还是要自己过一遍思路才记得牢
作者: chensc    时间: 2015-9-6 21:16
学习学习!
作者: silencea    时间: 2015-9-6 22:01
才开班,还没有学到这里.
作者: pyy061    时间: 2015-9-6 22:17
这个题老师讲之前就看到过,跟宿舍传智的讨论半天都不会
本来说问老师的,结果还没问就直接讲了...
作者: 羊口羊口羊    时间: 2015-9-7 00:54
赞一个!!!谢谢分享
作者: 庞佳星    时间: 2015-9-7 17:17
好东西谢谢了
作者: Mr.CHEN    时间: 2015-9-7 23:25
我来看看热闹
作者: 408205555    时间: 2015-9-8 18:42
本帖最后由 408205555 于 2015-9-8 18:43 编辑

2很好理解,不解释了。
int *p=(int*)(&a+1);
&a,a本来就是一个地址,&a相当于一个指向了该地址的指针。该地址是一个数组地址,那么&a就是一个数组指针。
数组指针+1,说明这个指针的偏移量(注意这里:我说的是偏移量)是sizeof(int)*5个字节,就是说指针一下偏移到了紧挨着数组的下一个地址。因为当前的这个指针是一个数组指针,它代表这个数组。+1就是数组的下一个位置。数组有多少个元素,指针就会向下偏移sizeof(元素类型)*元素类型所占字节。
把这个指针强制转换成(int*)就是说让这个指针不再以数组的长度作为标准计算,而是以普通的int类型所占字节来计算。
而int类型所占字节是4.
p-1就是向上偏移4个字节,可以理解成p+sizeof(int)*5-sizeof(int)=p+sizeof(int)*4,就是数组中下标是4的那个数据,就是5
作者: huahaoL    时间: 2015-9-8 23:28
我来看看热闹

作者: wulei1982516    时间: 2015-9-8 23:32
果然是经典题,出镜的频率太高了
作者: iphone    时间: 2015-9-9 18:26
是个好题。但是一维数组里硬是套个二维数组的知识点,实际应用中不建议这么使用,容易把人倒晕。。。
作者: jsh_513    时间: 2015-9-10 11:40
408205555 发表于 2015-9-8 18:42
2很好理解,不解释了。
int *p=(int*)(&a+1);
&a,a本来就是一个地址,&a相当于一个指向了该地址的指针。该 ...

回复清晰,准确,大神
作者: LucienER    时间: 2015-9-10 12:37
好吧…我不会…还要多努力啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2