首页 > 代码库 > 原来真的不会用指针[*p++]
原来真的不会用指针[*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 }
OK , Do You Understand Now?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。