指针转换的解析问题探讨

[复制链接]
1204|23
手机看帖
扫描二维码
随时随地手机跟帖
vivilzb1985|  楼主 | 2018-1-31 22:22 | 显示全部楼层 |阅读模式
类似于这样的:
MC_U8 *dm_cmd =NULL;
在开发时有如下的转换的,,怎么理解的?(void*)(*MC_U32*)dm_cmd
这个怎么理解的?

vivilzb1985|  楼主 | 2018-1-31 22:29 | 显示全部楼层
*dm_cmd 表示取该地址存的值;
(MC_U32*)dm_cmd 表示将该地址存的值强转成MC_U32位的数据;
(*MC_U32*)dm_cmd 表示取该强转成MC_U32的数据的地址;
*(*MC_U32*)dm_cmd 表示取该地址的数据;
(void*)(*MC_U32*)dm_cmd 表示该数据为任意类型的数据;

是这么理解的么?

使用特权

评论回复
magicoctoy| | 2018-2-28 17:39 | 显示全部楼层
vivilzb1985 发表于 2018-1-31 22:29
*dm_cmd 表示取该地址存的值;
(MC_U32*)dm_cmd 表示将该地址存的值强转成MC_U32位的数据;
(*MC_U32*)dm ...

有本很经典的书籍,c和指针,里面讲的很详细的。

使用特权

评论回复
vibra2016| | 2018-2-28 23:28 | 显示全部楼层
(void*)(*MC_U32*)dm_cmd,,,,该问题可以解析如下的,,大家伙看是否OK的不。。。

使用特权

评论回复
vibra2016| | 2018-2-28 23:29 | 显示全部楼层
本来dm_cmd为void型指针,,MC_U32*)dm_cmd,,这样是直接转换成U32的指针

使用特权

评论回复
vibra2016| | 2018-2-28 23:30 | 显示全部楼层
(*MC_U32*)dm_cmd,,将转换成U32型的指针后,取其指向的对象

使用特权

评论回复
vibra2016| | 2018-2-28 23:30 | 显示全部楼层
(void*)(*MC_U32*)dm_cmd,,将其指向的对象转换成void型的指针

使用特权

评论回复
shenmu2012| | 2018-2-28 23:49 | 显示全部楼层
vivilzb1985 发表于 2018-1-31 22:29
*dm_cmd 表示取该地址存的值;
(MC_U32*)dm_cmd 表示将该地址存的值强转成MC_U32位的数据;
(*MC_U32*)dm ...

这个理解还是有点出入的

使用特权

评论回复
angerbird| | 2018-3-17 13:35 | 显示全部楼层
这个不难理解的吧,,,主要是跟数据在内存存储相关系的

使用特权

评论回复
angerbird| | 2018-3-17 13:35 | 显示全部楼层
我也补充下的,大家看是否OK的不

使用特权

评论回复
angerbird| | 2018-3-17 13:36 | 显示全部楼层
这个意思就是先将U8型的指针转换成U32型的指针,,,

使用特权

评论回复
angerbird| | 2018-3-17 13:38 | 显示全部楼层
数据在内存中的最小存储单位是U8型的,我这里是需要取到这个内存处存放的地址,且地址是U32的,这跟MCU是相关的

使用特权

评论回复
angerbird| | 2018-3-17 13:40 | 显示全部楼层
故此,需要将U8 型的指针转换成U32的,,那么转换后,其指向的内容直接就是一个4字节的地址的,满足要求了

使用特权

评论回复
angerbird| | 2018-3-17 13:41 | 显示全部楼层
而我们要的是该4字节的地址所指向的内容的,故需要在加上*的,即成了*(MC_U32*)cmd_mask

使用特权

评论回复
angerbird| | 2018-3-17 13:45 | 显示全部楼层
另,该U32地址所指向的内容是以U8为单位存储的,,这里前边加上void*,即吧该地址指向的对象转换成任意类型的,便于其他对象访问的

使用特权

评论回复
smilingangel| | 2018-3-18 20:55 | 显示全部楼层
vivilzb1985 发表于 2018-1-31 22:29
*dm_cmd 表示取该地址存的值;
(MC_U32*)dm_cmd 表示将该地址存的值强转成MC_U32位的数据;
(*MC_U32*)dm ...

这个解析的有点问题的吧

使用特权

评论回复
chuntian2016| | 2018-3-21 21:14 | 显示全部楼层
vivilzb1985 发表于 2018-1-31 22:29
*dm_cmd 表示取该地址存的值;
(MC_U32*)dm_cmd 表示将该地址存的值强转成MC_U32位的数据;
(*MC_U32*)dm ...

这个解释的比较牵强的,不过结果只要正确就可以的

使用特权

评论回复
firstblood| | 2018-3-21 21:22 | 显示全部楼层
(void*)(*MC_U32*)dm_cmd,这个简单点来说的就是取dm_cmd处存放的32位地址所存放数据的

使用特权

评论回复
comeon201208| | 2018-3-21 23:34 | 显示全部楼层
magicoctoy 发表于 2018-2-28 17:39
有本很经典的书籍,c和指针,里面讲的很详细的。

c和指针这本书的么?

使用特权

评论回复
baimiaocun2015| | 2018-3-21 23:53 | 显示全部楼层
这个最近楼上几位解析的都非常不错的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:后来乍到,前辈们多多包涵了啊。。

88

主题

4276

帖子

6

粉丝