原来真的不会用指针[*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?

时间: 2024-08-07 16:45:01

原来真的不会用指针[*p++]的相关文章

你真的了解数组和指针么?

1. 数组和指针的联系想来都是密不可分的. 实际上, 在C语言中, 只存在一维数组, 而你所看到和学到的那些所谓的多维数组, 只不过是用一维数组构造出来的. 其本质依旧是一个普普通通的一维数组. 而关键就在于, 这个一维数组中的元素, 可以是任意类型的对象. 如果我在里面放几个数组, 那么它自然就变成了多维的数组了.                 2.  我们如何表示一个数组呢? 只用两个关键点即可: 大小, 首元素地址.你或许会说, 那下标呢? 不是可以通过下标访问数组么? 没错, 这也是正

int **指针问题

转自:http://blog.csdn.net/u012501459/article/details/45395571 在打印二维数组时遇到了问题,二维数组可以这样定义int matrix[ROWS][COLUMNS],但是打印二维数组时函数的声明是void printMatrix(int ** numbers,int rows,int columns).那么将matrix作为参数传递给printMatrix时会出现问题,因为matrix是 int (*)[COLUMNS]类型的,但是函数pri

013-结构体-C语言笔记

学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7.[掌握]结构体与函数 一.返回指针的函数 指针作为函数的返回值 指针是可以作为函数的返回值的,不能返回局部变量的指针,因为当函数执行结束后指针变量就释放了.如果我们真的需要返回一个指针变量,那就要保证我 们的函数执行完毕之后,指针指向的变量仍然存储在内存之中.那我们可以将变量创建在堆空间中,使用malloc或者calloc申

C++标准转换运算符dynamic_cast

dynamic_cast <new_type> (expression) dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的转换方式来替代.但是也因此它是最常用,最不可缺少的一个运算符. 与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系. 更准确的说,dynamic_cast是用来检查两者是否有继承关系.因此该运算符实

揭秘DOM中data和nodeValue属性同步改变那些事

问题引发:最近在整理DOM系列的一些知识点,发现在DOM的某些接口API中,存在一些我想不通的现象.就随便举个例子吧:DOM文档模型中的文本节点,可以通过nodeValue或data属性访问文本节点的文本内容,而且在更新data的时候nodeValue也即时更新,反之亦然.不光是data或nodeVaulue有这种相互影响的关系,其他类型节点也有比如该改变document.title也会随之改变网页标题.当时想弄明白这在JS引擎中是怎么实现的,于是乎进行了以下分析:通过文本节点的原型链继承关系

条款2. 最好使用C++转型操作符

C++提供了four cast operators: static_cast,const_cast,dynamic_cast and reinterpret_cast. 1. static_cast 用来进行基本类型数值间的转换,例如:int --- char,安全由程序员进行控制. 不能用于无关类型间指针间的转换,例如:int* --- double* 编译出错. 将null pointers – other pointers. 基类和派生类之间指针或者引用的转换.up-casting (把派

C++智能指针详解(真的很经典 )

C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_ptr.boost::scoped_array.boost::shared

二维数组和二级指针(真的没什么关系)

刚开始学c语言的时候,总是会认为,一级指针可以用来访问一维数组,那么二维数组就要用二级指针来访问啦.... 实际上二级指针和二维数组真的没什么关系,而且,切记千万不要用二级指针访问二维数组..... 下面是几个有关的小程序,加深印象........ 实验环境:主机CPU酷睿i5,vs2012 程序1: int _tmain(int argc, _TCHAR* argv[]) { int **p= NULL; int a[2][3] = {1,2,3,4}; p = a; return 0; }

private成员变量真的私有吗?(用指针刨他祖坟)

今天写程序时突然想到的,为什么不用指针去获取类的成员变量呢.于是做了这个实验.首先定义了一个类: 1 class Test { 2 private: 3 int i; 4 char c; 5 int* p; 6 public: 7 Test(int i,char c,int* p) 8 :i(998),c('Q'),p(new int(9999)){} 9 ~Test(){delete p;} 10 }; 有三个private的成员变量.该类型的对象在内存中的分布应该是这样的: 占12个字节,其