+ -
当前位置:首页 → 问答吧 → 刘峰六的C语言讲解-- C指针(1)

刘峰六的C语言讲解-- C指针(1)

时间:2010-08-29

来源:互联网

请给出下面程序的运行结果___
  1. /* env: 32 bits*/  
  2. int   
  3. main(void)   
  4. {   
  5.   long *p=0x100;   
  6.   p=p+sizeof(long);   
  7.   printf("%x\n",p);   
  8.   
  9.   return 0;   
  10. }  
  11. /* env: 32 bits*/
  12. int
  13. main(void)
  14. {
  15.   long *p=0x100;
  16.   p=p+sizeof(long);
  17.   printf("%x\n",p);

  18.   return 0;
  19. }
复制代码
正确答案:  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

作者: sohu2000000   发布时间: 2010-08-29