原来真的不会用指针[*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("\n");
14 
15     p = s;
16     tmp1 = ((*p++)&0xFF) | (((*p++)&0xFF)<<8);
17     printf("tmp1=%04x, *p=%d.\n", tmp1, *p);
18 
19     p = s;
20     tmp2 = (*p++)&0xFF;
21     printf("tmp2=%04x, *p=%d.\n", tmp2, *p);
22     tmp2 = tmp2 | (((*p++)&0xFF)<<8);
23     printf("tmp2=%04x, *p=%d.\n", tmp2, *p);
24 
25 }
View Code

 

  

 

OK , Do You Understand Now?

 

posted @ 2014-05-28 18:42  yison.li  阅读(364)  评论(0编辑  收藏  举报