关于C指针和数据类型的问题

apn172 2009-07-16 06:05:32
关于C指针和数据类型的测试 收藏
今天看到如下一段代码:


getforsecond(&pIec104->T3StartSec);

HimRecvSerial=(*(USHORT *)&RecvBuff[4])>>1;//将RecvBuff[5],RecvBuff[4]右移

pIec104->HasAckSend=HimRecvSerial;

if(pIec104->HasAckSend == pIec104->SendSerial)

{

pIec104->bT1Open=FALSE;

}



比如RecvBuff[5]=0010 0001,RecvBuff[4]=0000 0010

如上函数操作后结果为 HimRecvSerial 0001 0000 1000 0001

感到很迷惑,写程测试后发现确是如此.



RecvBuff为UCHAR型数组,HimRecvSerial 为USHORT类型数据,

&RecvBuff[4],是取一个UCHAR变量的地址,

(USHORT *)&RecvBuff[4]是将UCHAR指针强制转换为USHORT 类型的指针.

之前我都是比较明白的 我不明白为什么然后再加*取其内容后就能将RecvBuff[5]的内容取过来


我测试的时候发现RecvBuff[5]的地址为RecvBuff[4]的地址加一.



哪位高手能帮我解释下.



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/apn172/archive/2009/07/16/4354456.aspx
...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu044 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xu044 的回复:]
一般来说,Intel的处理器采用小尾方式来存取内存数据,就是说低位数据存储在低地址,数组也是一样,如果有一个字符数组Array[2]其首地址为0x080480000,则Array[0],Array[1]依次存在地址0x080480000, 0x080480001的内存单元上,再假设Array[0]中存的是字符A,其ASCII码为0x41,二进制为0100 0001,Array[1]中存的是字符B,其ASCII码为0x42,二进制为0100 0010,如果按左高右低来表示内存地址的话,在内存中应该是0100 0010 0100 0001。即B在高地址,A在低地址。
如果你把Array[0]的地址给了ushort的话,就会把后面接着的Array[1]解释为ushort的高字节,Array
[0]则解释为低字节。
一个变量的地址总是指这个变量存储单元的低字节。无论是short,long,long long,还是float,double等!

[/Quote]
xu044 2009-07-17
  • 打赏
  • 举报
回复
一般来说,Intel的处理器采用小尾方式来存取内存数据,就是说低位数据存储在低地址,数组也是一样,如果有一个字符数组Array[2]其首地址为0x080480000,则Array[0],Array[1]依次存在地址0x080480000, 0x080480001的内存单元上,再假设Array[0]中存的是字符A,其ASCII码为0x41,二进制为0100 0001,Array[1]中存的是字符B,其ASCII码为0x42,二进制为0100 0010,如果按左高右低来表示内存地址的话,在内存中应该是0100 0010 0100 0001。即B在高地址,A在低地址。
如果你把Array[0]的地址给了ushort的话,就会把后面接着的Array[1]解释为ushort的高字节,Array
[1]则解释为低字节。
一个变量的地址总是指这个变量存储单元的低字节。无论是short,long,long long,还是float,double等!
飞天御剑流 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 apn172 的回复:]
我比较迷惑的是比如一个USHORT A;变量 如果该变量放在内存地址为0X 00120010 和 0X 00120011 的内存空间内 我想知道对该变量取地址的话 得到的值应该是0X 00120010呢还是11呢
[/Quote]

取地址的话得到的当然是地址00120010啦。
apn172 2009-07-17
  • 打赏
  • 举报
回复
我比较迷惑的是比如一个USHORT A;变量 如果该变量放在内存地址为0X 00120010 和 0X 00120011 的内存空间内 我想知道对该变量取地址的话 得到的值应该是0X 00120010呢还是11呢
飞天御剑流 2009-07-16
  • 打赏
  • 举报
回复
RecvBuff为UCHAR型数组,HimRecvSerial 为USHORT类型数据,

&RecvBuff[4],是取一个UCHAR变量的地址,

(USHORT *)&RecvBuff[4]是将UCHAR指针强制转换为USHORT 类型的指针.

之前我都是比较明白的 我不明白为什么然后再加*取其内容后就能将RecvBuff[5]的内容取过来
------------------------------------------------------------------------------
RecvBuff[4]的地址转换为USHORT*后,其类型表示此地址指向一个类型为USHORT的对象,*是间接运算符啊,本来意义就是解引用成为这个USHORT对象本身,因此*(USHORT *)&RecvBuff[4]就是那个

由RecvBuff[4]和RecvBuff[5]组成的USHORT类型的数值啦。
pengzhixi 2009-07-16
  • 打赏
  • 举报
回复
(USHORT *)&RecvBuff[4]是将UCHAR指针强制转换为USHORT 类型的指针.

之前我都是比较明白的 我不明白为什么然后再加*取其内容后就能将RecvBuff[5]的内容取过来
实际上(USHORT *)&RecvBuff[4]是将 RecvBuff[4]这块内存的开始地址转换成USHORT *类型,而USHORT这个类型刚好是
RecvBuff[4]和RecvBuff[5]两部分内存的大小,所以在对它解引用之后就将RecvBuff[4]和RecvBuff[5]两部份内存地址里面的东西解释成USHORT。
比如:int a=1;
*(char*)&a;//这就是将a变量对应的那块内存的起始地址转型作为char*类型,前面再加上*这个解引用符号就得到了4个字节中第一个字节里面的内容。将这个字节里面的内容以char类型来解释。
pengzhixi 2009-07-16
  • 打赏
  • 举报
回复
比如RecvBuff[5]=0010 0001,RecvBuff[4]=0000 0010

如上函数操作后结果为 HimRecvSerial 0001 0000 1000 0001


HimRecvSerial=(*(USHORT *)&RecvBuff[4])>>1;//将RecvBuff[4]和RecvBuff[5]两个字节做为一个unsigned int向右移动一位吧。这样就得到HimRecvSerial 0001 0000 1000 0001

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧