OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3837|回复: 5

一个不明白的c基础。

[复制链接]

2

主题

21

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2020-2-16
在线时间
223 小时
发表于 2021-1-11 00:15:47 来自手机 | 显示全部楼层 |阅读模式
在写一个FSMC的显示碰到一句不是很理解的c指针那个朋友能不能解答。

#define LCD_Data *(u16*)((u32)(0x60000000))
这句话是啥意思呀?还望会的朋友解答。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8632
金钱
8632
注册时间
2020-5-11
在线时间
4070 小时
发表于 2021-1-11 10:41:35 | 显示全部楼层
强制类型转换了解一下
https://baike.baidu.com/item/%E5 ... /1580197?fr=aladdin
0x60000000转换为无符号32位数据,然后转换为指向16位数据的指针,指针前加个*号就可对内存地址0x60000000内的16位数据进行操作。
专治疑难杂症
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-1-11 11:12:30 | 显示全部楼层
#define LCD_Data *(u16*)((u32)(0x60000000))
根据括号的优先级
第一步拆解出数据或变量 0x60000000
第二步拆解出(u32),放在0x60000000,说明0x60000000是个无符号的32位数。
第三步拆解出((u32)(0x60000000)),把这整个括号看成一个整体,假定替换成AAAA,使AAAA=((u32)(0x60000000))。
第四步拆解出,(u16*)AAAA,说明,AAAA是个16位的指针。
第五步,是最前面的*,*在指针中就是取值,所以是取以AAAA里面的数据作为地址,这个地址里面存放的值
所以总结就是,取0x60000000里面的数据作为地址,然后在这个地址里面取出16位数

回复 支持 反对

使用道具 举报

5

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2020-7-9
在线时间
70 小时
发表于 2021-1-11 15:04:42 | 显示全部楼层
从右往左  第一步  将0x60000000 这个数  强制转换成  32位的数, 然后就剩两个括号和一个*     后面两个括号u16*  把刚才转的数据又换成16 位的地址指针, 下一步  处理最前面*   取这个地址里的数
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2020-2-16
在线时间
223 小时
 楼主| 发表于 2021-1-11 21:31:03 | 显示全部楼层
谢谢解释!!!!!
回复 支持 反对

使用道具 举报

0

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-10-10
在线时间
131 小时
发表于 2021-1-14 11:09:20 | 显示全部楼层
本帖最后由 YukawaManabu 于 2021-1-14 11:12 编辑

你正在操作一个变量,这个变量的类型是u16,变量的地址是0x60000000,,所以在之前加了u32 显式的进行类型转换,是为了保证在32位的环境0x60000000这个数据符合地址的长度要求
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 15:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表