Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47639
  • 博文数量: 25
  • 博客积分: 1210
  • 博客等级: 中尉
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-20 20:05
文章存档

2011年(1)

2009年(24)

我的朋友
最近访客

分类: C/C++

2009-04-29 20:45:36

//分析下面这段代码的输出,考到了指针,大小端,字长。
#include
#include
int main()
{
    int a[5]={7,8,9,10,11};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int )a+1);
    printf("%x,%x",ptr1[-1],*ptr2);
    return 0;
}
/* 分析:
&a+1 的分析:   
一维数组名是指向列的,在列指针前面加上一个&就变成行指针,行指针加1自然就指向了数字11的下一个数据的地址,因此ptr1[-1]就指向了11,故输出为b
对 ((int )a+1) 的分析:
说明:在这里一个int型的数据占4个字节,计算机中是按小端方式储存的
a[5]={7,8,9,10,11}在内存中存储的形式(按16进制)为:
..................00 00 00 08 00 00 00 07
注意,在这里a+1(int)a+1是不一样的,a+1指向数据8所在的内存地址,而(int)a+1则指向上面07前面的绿色的00所在的内存地址。因此*ptr2所指向的地址的数据为0x08000000(即为0x8000000)。
经过以上分析,可知输出结果为b,8000000
 

 
阅读(424) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-05-02 18:08:34

小端应该是低位低址,即这样排: 07 00 00 00 08 00 00 00 .... char *ptr =(char*)a; for (int i=0; i < 20; i++) printf("%d ",ptr[i]);