| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1459 人关注过本帖, 2 人收藏
标题:一个很细的问题,你注意到了吗?
只看楼主 加入收藏
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
收藏(2)
 问题点数:0 回复次数:30 
一个很细的问题,你注意到了吗?
程序代码:
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}

输出:?,?
请当做一个现场笔试题来做,不要CTR+C哦~

[ 本帖最后由 luyi_footman 于 2011-8-25 18:36 编辑 ]
搜索更多相关主题的帖子: 问题 
2011-08-25 18:35
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
嗯~这个贴好
2011-08-25 18:38
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
收藏
得分:0 
回复 2楼 voidx
哈~所以我要求不能之前编译再作答,不过呢,如果实在是最后忍不住编译了下知道结果了,最好能说出个所以然来。我想,只要每个看过这贴的朋友都认真的思考的话,肯定会由收获的。如果大家反响效果好的话,我以后会多发起注入此类的帖子的。

天道酬勤!
2011-08-25 18:45
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
2 5
主要是&a+1
&a取的是a[5]的地址 注意+1的步长就行了。。

小白路过  以上言论  概不负责

[ 本帖最后由 naruto01 于 2011-8-25 18:51 编辑 ]
2011-08-25 18:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
提前声明我用编译器了 其实是这样 &a的地址相当于取整个数组的地址 这个指针的类型是指向5个整数的

整形数组 所以加一相当于移动了5个整数 所以越界了  如果要是再转整形减一 那么就指向了五

                                         
===========深入<----------------->浅出============
2011-08-25 18:50
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 5楼 laoyang103
就是这么回事,不过好像不该说是越界,而是 ptr 指向了 a[4] 后面的那个内存单元
2011-08-25 18:54
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
收藏
得分:0 
结果是 2,5
也就是输出 a[1],a[4]
如此运用指针运算,这不知道目的何在?难为初学者吗?
int *ptr=(int *)(&a+1);//已经超出了数组a的有效地址范围,指向了&a[4]之后的地址了
printf("%d,%d",*(a+1),*(ptr-1));
这里的*(a+1)<=>a[1],吓唬初学者的,虽然a[1]在编译的时候是表示为:*(a+1)的
*(ptr-1),前面已经说了 ptr已经指到数组a的有效数据后面了,都是int型的,所以
(ptr-1)指向&a[4],故*(ptr-1)<==>a[4];
这样输出结果就出来了
这题就是忽悠人的!!用不规范的写法,和不符合逻辑的表达方式来实现的!
2011-08-25 18:56
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
楼上的头像总让我觉得像是个小太监~ 嘿~

没有恶意的哦~
2011-08-25 19:02
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
收藏
得分:0 
回复 8楼 voidx
哈哈,现在不是流行不男不女的造型吗?小沈阳不是就火了吗!
我也希望快点火
2011-08-25 19:07
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
收藏
得分:0 
回复 7楼 Luminal
恩,谢谢你的回复,而且你的解释也很专业,不过我想就你的回复补充两点我的看法
1:当ptr指向a[4]的下一个地址时应该不能解释为越界,ptr作为一个指向整型数的指针可以被初始化为指向任何地址(当然是内存范围内),所以个人理解不应该是越界,而只是一个不寻常的指针初始化而已。
2:我出这样一个题目绝没有难为初学者的意思,因为自己本身就是一个初学者。

天道酬勤!
2011-08-25 19:13
快速回复:一个很细的问题,你注意到了吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012570 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved