| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 527 人关注过本帖
标题:帮忙解释下这段代码为什么输出这样的结果。
只看楼主 加入收藏
pykuyuan
Rank: 2
等 级:论坛游民
帖 子:46
专家分:34
注 册:2009-6-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
帮忙解释下这段代码为什么输出这样的结果。
程序代码:
#include <stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);
    printf("%x,%x",ptr1[-1],*ptr2);
    return 0;
}
//输出结果是5,2000000
搜索更多相关主题的帖子: 代码 结果 输出 解释 
2010-07-13 18:07
pykuyuan
Rank: 2
等 级:论坛游民
帖 子:46
专家分:34
注 册:2009-6-26
收藏
得分:0 
难道分少?

逐渐变黑
2010-07-13 18:26
pykuyuan
Rank: 2
等 级:论坛游民
帖 子:46
专家分:34
注 册:2009-6-26
收藏
得分:0 
人工那个置顶。。。。

逐渐变黑
2010-07-13 18:38
dstone
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:20
专家分:125
注 册:2010-6-17
收藏
得分:6 
这里一个int应该是4个字节,其实要知道为什么这样也容易,好好去看下函数在调用过程中,数组在堆栈中的存储位置,用表的方式画出{1,2,3,4,5}在每块内存地址中对应其存放的数字的二进制形式,然后根据a的地址得出ptr1,ptr2的值,对照地址往后4个字节,就可以得到5,2000000.
2010-07-13 19:05
pykuyuan
Rank: 2
等 级:论坛游民
帖 子:46
专家分:34
注 册:2009-6-26
收藏
得分:0 
额,我应该加强调试能力了 正好找到一边vc++6.0的调试文章

逐渐变黑
2010-07-13 19:08
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:6 
ptr1
&a是a[0]的地址:0x22ff24,&a+1不是加了一个int所占的空间,而是加了这个数组所占的空间,也就是0x14,得到&a+1即是0x22ff38
ptr[-1]即*(ptr-1),就是0x22ff38-4处内存所存的值,即a[4]的值

至于为什么&a+1不是加了一个int所占的空间,而是加了这个数组所占的空间(根据&a+2得0x22ff4c得出),我不知道,我刚开始是认为加一个int所占空间


ptr2
(int)a+1将a[0]的地址转换成整数再加1,便是整数的数学运算,而不是地址的数学运算了,所以(int)a+1为0x22ff24+1,即0x22ff25

看一下现在的内存
0x22ff24(地址,下同)  0x01(值,下同)
0x22ff25  0x00
0x22ff26  0x00
0x22ff27  0x00
0x22ff28  0x02

比较明显了(注意字节序)
0x22ff24处存放的int值是0x00000001,0x22ff25处便是0x2000000了
2010-07-13 19:28
不归鹄
Rank: 9Rank: 9Rank: 9
来 自:冥王星
等 级:蜘蛛侠
威 望:4
帖 子:491
专家分:1380
注 册:2009-12-20
收藏
得分:6 
a本身就是个地址,&a和a的值是一样的。&a+和1a+1也是一样的,这就是为什么&a+1加的是sizeof(a)的长度。所以ptr1[-1]就是a[4]了。
后面那一句就不说了。

总的来说这样写程序不好,数组越界,指针乱指,程序的隐患很大,健壮性极差

2010-07-13 20:05
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
回复7楼:
&a+1和a+1的结果不一样
&a+1是加sizeof(a)而a+1是加sizeof(int)

这是我疑惑的原因
2010-07-13 21:09
不归鹄
Rank: 9Rank: 9Rank: 9
来 自:冥王星
等 级:蜘蛛侠
威 望:4
帖 子:491
专家分:1380
注 册:2009-12-20
收藏
得分:0 
是我错了,a,&a,&a[0],的值确实是一样的,但指向的内容是不一样的,a , &a[0] 都指向元素 a[0], 但 &a 指向的却是整个数组,我觉得可以这样解释为什么 &a 指向的是整个数组,假如 x 是整形变量,那么 &x 指向的就是 x 变量,同理,a 是个数组变量,所以 &a 指向的是数组变量 a,也就是整个数组的长度了。

2010-07-14 10:43
pykuyuan
Rank: 2
等 级:论坛游民
帖 子:46
专家分:34
注 册:2009-6-26
收藏
得分:0 
感谢大家的回答,我思考一下。这是一个面试题,哪里的不知道了。 用意么,本人才疏学浅。。。。。

[ 本帖最后由 pykuyuan 于 2010-7-14 15:19 编辑 ]

逐渐变黑
2010-07-14 11:25
快速回复:帮忙解释下这段代码为什么输出这样的结果。
数据加载中...
 
   



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

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