zoukankan      html  css  js  c++  java
  • 原来真的不会用指针[*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?

  • 相关阅读:
    Hibernate的一些操作
    工作心得
    放款流程
    关于C#事件的自我构想和学习
    委托之winForm窗口间传递数据
    C#中string[]数组和list<string>泛型的相互转换 【转】
    关于注册界面中的一些规则设计时要注意
    系统界面设计---风格
    关于系统注册,做卡号重校验
    关于系统设计中的硬件开发
  • 原文地址:https://www.cnblogs.com/yisonli/p/3757700.html
Copyright © 2011-2022 走看看