• 原来真的不会用指针[*p++]


    Describe:

      有2字节字符数据,需要转换成2字节的短整型,字符数据低字节在前。

    Analyse:

      其实就是取一下数据,移位再或一下就好了,大伙都这样想的。

    Ex1:

      假设tmp1就是短整型,p指向数据为{0x01, 0x02}请看如下表达式:

    1 tmp1 = ((*p++)&0xFF) | (((*p++)&0xFF)<<8);

      这条表达式从编译上来说,没有任何语法错误,然而得到的结果却不是我们想要的。

    Ex2:

      我们再看一个表达式:

    1 tmp2 = (*p++)&0xFF;
    2 tmp2 |= (((*p++)&0xFF)<<8);

      这样的表达式跟Ex1的表达式的差异,仅仅在于分成了两行,然而结果却对了。

    Why:

      问题出现在*p++处,它的作用是先取*p的值,然后再p++;但是Ex1在第2个*p++的时候,p是否已经++了呢?

      从现象来看,第2个*p++处,p并未被++,所以出现了不是你想要的结果。

    Test & Result:  

     1 #include <stdio.h>
     2 
     3 void main()
     4 {
     5     unsigned char s[4] = {0x01, 0x02, 0x03, 0x04};
     6     unsigned short tmp1, tmp2;
     7     unsigned char* p = NULL;
     8     int i;
     9 
    10     printf("unsigned char s[] = ");
    11     for(i=0;i<4;i++)
    12         printf("%02x ", s[i]);
    13     printf("
    ");
    14 
    15     p = s;
    16     tmp1 = ((*p++)&0xFF) | (((*p++)&0xFF)<<8);
    17     printf("tmp1=%04x, *p=%d.
    ", tmp1, *p);
    18 
    19     p = s;
    20     tmp2 = (*p++)&0xFF;
    21     printf("tmp2=%04x, *p=%d.
    ", tmp2, *p);
    22     tmp2 = tmp2 | (((*p++)&0xFF)<<8);
    23     printf("tmp2=%04x, *p=%d.
    ", tmp2, *p);
    24 
    25 }
    View Code

      

    OK , Do You Understand Now?

  • 相关阅读:
    gif&png&jpg&webp
    设计点滴&css效果点滴
    backbone点滴
    js自己总结的小东西(打印出来方便学习)
    nodejs点滴
    js类型
    mongo学亮的分享
    npm package.json中的dependencies和devDependencies的区别
    161130、Dubbo+SpringMVC工程创建详解
    161129、详解5种跨域方式及其原理
  • 原文地址:https://www.cnblogs.com/yisonli/p/3757700.html
Copyright © 2020-2023  润新知