当前位置: 代码迷 >> 单片机 >> 怎的理解(((unsigned char *)&argument)[0]); argument为 long型
  详细解决方案

怎的理解(((unsigned char *)&argument)[0]); argument为 long型

热度:226   发布时间:2016-04-28 15:52:02.0
怎样理解(((unsigned char *)&argument)[0]); argument为 long型
在操作sd卡时总会看到
C/C++ code
void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC){    SdWrite(command|0x40);    SdWrite(((unsigned char *)&argument)[0]);    SdWrite(((unsigned char *)&argument)[1]);    SdWrite(((unsigned char *)&argument)[2]);    SdWrite(((unsigned char *)&argument)[3]);


执行了 (((unsigned char *)&argument)[0]); 是否就自动转成字节了?为什么? argument是long型,即4字节。

------解决方案--------------------
如果是大端模式,假设argument=0x12345678,其地址是0x10

地址 值 uchar buf[4]
0x10 0x78 buf[0] 
0x11 0x56 buf[1]
0x12 0x34 buf[2]
0x13 0x12 buf[3]
(((unsigned char *)&argument)[0]);

第一步
&argument,得到其地址0x10

第二步
(unsigned char*)&argumen
将其地址转换成一个uchar型的指针(或者说是一个uchar型的数组)

第三步
(((unsigned char *)&argument)[0])
加下标[0],得到第二步转换的数组的第一个元素,上面的是0x78 


 
------解决方案--------------------
在32位编程模式下
&argument 得到的地址是 4个字节 0xABCDABCD

(unsigned char*)&argumen
将其地址转换成一个uchar型的指针,这样就可以按照字节访问地址了

(((unsigned char *)&argument)[0]),访问该地址开始的第一个字节
  相关解决方案