标题:请大神们解释解释这诡异小程序的结果
只看楼主
安静的金龙
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-4-2
结帖率:100%
已结贴  问题点数:20 回复次数:14 
请大神们解释解释这诡异小程序的结果
#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,200;
求高手解释
搜索更多相关主题的帖子: 200 include return 
2012-04-07 17:04
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
得分:2 
#include <stdio.h>
 int main()
 {
     int a[5]={1,2,3,4,5};
     int *ptr1=(int *)(a+1);//a本来就是一个地址了,不要再加&了
     int *ptr2=(int *)(a+1);//同理,强制转换成int使得+1会出错
     printf("%x,%x",ptr1[-1],*ptr2);
     return 0;
 }


酱油实习生
2012-04-07 17:28
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
得分:2 
a能加1吗?

最基础的往往是你最容易忽略的!
2012-04-07 17:33
天一神话
Rank: 2
等 级:论坛游民
帖 子:23
专家分:33
注 册:2012-3-29
得分:2 
回复 3楼 于祥
当然可以,比如说
int a[],*p;
p=a;
*(p+1)==*(a+1)==a[1]
2012-04-07 17:39
嘛事马肉
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-7-31
得分:2 
很好奇,围观!希望高手详细解释
不知楼主是自己写的还是什么地方的,但有一点我没弄明白,对于指针而言是不能赋值除地址之外的任何值的.
(int *)(&a+1)和(int *)((int)a+1),这两个表达式的最终值,我个人觉得不是地址,也就说这个程序最终输出结果应该是任意的,但是我去运行了一下,发现第一个结果的确是5,只不过第二个结果不同而已!
2012-04-07 17:50
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:2 
int a[5]={1,2,3,4,5};

int *ptr_1 = (int *)(&a+1);
int *ptr_2 = (int *)(a+1);这两者是有区别的

&a + 1  一次跨越a数组元素的长度 就类似操作二维数组差不多
        所以ptr_1实际指向的是a数组末尾的下一个位置
a+1 这个大家都知道
2012-04-07 18:07
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
回复 楼主 安静的金龙
至于200 的那种情况
小端对齐
我上面int类型占有4字节结果是0x2000000  你上面应该是2个字节所以才会是0x200  
0 1
1
2
3
4 2
5
6
7
8 3
9

(int*)((int)a + 1)    指向的就是1的位置  int 占据4字节  所以是 0x2000000  自己可以试着移动看看结果

2012-04-07 18:23
嘛事马肉
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-7-31
得分:0 
回复 6楼 寒风中的细雨
感谢解释,明白点了!
但是还想请教一点,&a+1既然已经是地址了,为什么前面还要加一个(int *),在这里有什么用呢?谢谢
2012-04-07 18:28
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
a+1  和  (int)a+1 的不同   后者 已经强转  所以在转换到汇编的时候  系统不会像做a+1那样的处理  
示意下具体的代码忘记了 a + sizeof(typeid(a))*1
2012-04-07 18:29
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
回复 8楼 嘛事马肉
可以自己 改动   看编译器给你反馈什么信息

因为 warning的级别是可以自己调的
2012-04-07 18:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-365324-1-1.html




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

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