Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2085821
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类: C/C++

2010-08-29 23:44:43

请给出下面程序的运行结果___
 

/* env: 32 bits*/
int
main(void)
{
  long *p=0x100;
  p=p+sizeof(long);
  printf("%x\n",p);
  
  return 0;
}
/* env: 32 bits*/
int
main(void)
{
  long *p=0x100;
  p=p+sizeof(long);
  printf("%x\n",p);
  return 0;
}


正确答案:  110
解析:
本题考察三个知识点:
1. 存储类型
2. 指针运算
3. printf格式化输出
我们来分析一下。
1 存储类型
   基于题目给出了32bit运行环境的概念,根据C99对于编译器是如何在内存中识别数据类型和读取的协议规范可知:
   sizeof(char)=1;
   sizeof(short)=2;
   sizeof(int)=4;
   sizeof(long)=4;
   sizeof(float)=4;
   sizeof(double)=8;
  
   所以,程序中 p=p+sizeof(long); 就转化成为 p=p+4;
2 指针的运算
   一般int类型算数int i =2 i=i+4 那么 i=6正确;
   但是指针真的运算有着其不同的含义,按照我个人的理解,解释如下
   ptr=ptr+m 的意义是 ptr沿着内存先前移动,移动了m个单位的距离, 单位的距离取决于ptr所指向的数据的内存存储空间的大小
   这里 p 指向long, 所以 p=p+4, 并不是 p=0x100+4;而是 p = 0x100+4*4 = 0x100+16;
3.printf的格式化输出
   printf的格式是%x,说明输出的内容是结果的十六进制模式,需要小心应答
   我们平时说的类型存储,sizeof()等等都是针对十进制而言
   所以上面提到的16,并不是内存看到的指令,
   16 = 0x10;
   p=0x100+0x10=0x110
   至此得到正确答案
综上所述,争取答案是110
刘峰六于 2010-08-22 23:38:56
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/08/29/5848553.aspx
阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~