A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiniuniu 中级黑马   /  2014-8-15 12:15  /  1477 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xiniuniu 于 2014-8-15 12:19 编辑

      老师的视频讲过类型就是固定大小的内存块,并可以对这块内存进行某些特定的操作!
这个问题也是论坛中同学提出来的。代码如下:
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {

  4.     char v = 3;
  5.     char *p = &v;
  6.     int  *p2 = (int*)&v;
  7.    
  8.     printf("%x\n", *p);
  9.     printf("%x\n", *p2);
  10.    
  11.     return 0;
  12. }
复制代码


    为什么输出结果会不一样呢,调试看内存,截图如下:


p 和p2指针都指向地址:0x7fff5fbff8ef
而p是char*类型的指针所以它只把0x7fff5fbff8ef处开始的一个字节解释为字符类型。而在printf中格式化输出%d又把这一字节按整数输出。而这一字节中
存放的数值为0x03。所以输出为3(16进制);  而p2是int*类型,所以把0x7fff5fbff8ef开始的四字节数据解释为int类型, 也就是把03后边三字节数据也包含了进来,而03后边的数据是其它变量的数据或内存中残留的垃圾数据,所以每次输出结果可能不会相同。而苹果操作系统内存访问模式是小端模式,也就是数据的高位放在高地址 低位放在低地址 。所以最终输出 bf f9 20 03
这也是指针为什么也要有类型的原因。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马