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

时间:2023-03-09 17:45:43
原来真的不会用指针[*p++]

Describe:

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

Analyse:

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

Ex1:

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

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

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

Ex2:

  我们再看一个表达式:

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

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

Why:

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

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

Test & Result:  

 #include <stdio.h>

 void main()
{
unsigned char s[] = {0x01, 0x02, 0x03, 0x04};
unsigned short tmp1, tmp2;
unsigned char* p = NULL;
int i; printf("unsigned char s[] = ");
for(i=;i<;i++)
printf("%02x ", s[i]);
printf("\n"); p = s;
tmp1 = ((*p++)&0xFF) | (((*p++)&0xFF)<<);
printf("tmp1=%04x, *p=%d.\n", tmp1, *p); p = s;
tmp2 = (*p++)&0xFF;
printf("tmp2=%04x, *p=%d.\n", tmp2, *p);
tmp2 = tmp2 | (((*p++)&0xFF)<<);
printf("tmp2=%04x, *p=%d.\n", tmp2, *p); }

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

OK , Do You Understand Now?