[PIC®/AVR®/dsPIC®产品] 联合体与结构体的指针用法

[复制链接]
 楼主| xuanhuanzi 发表于 2024-3-22 21:08 | 显示全部楼层 |阅读模式
  1. typedef union
  2. {
  3.     struct
  4.     {
  5.         uint8_t lowByte;
  6.         uint8_t highByte;
  7.     } refined;
  8.     uint16_t deviceId;
  9. } bk_reg00;

  10. /**
  11. * @ingroup GA01
  12. * [url=home.php?mod=space&uid=247401]@brief[/url] Chip ID
  13. *
  14. */
  15. typedef union
  16. {
  17.     struct
  18.     {
  19.         uint8_t lowByte;
  20.         uint8_t highByte;
  21.     } refined;
  22.     uint16_t chipId;
  23. } bk_reg01;


  24. uint16_t shadowRegisters[2]; //!< shadow registers 0x00  to 0x01

  25. // Device registers map - References to the shadow registers
  26. bk_reg00 *reg00 = (bk_reg00 *)&shadowRegisters[REG00]; //  0
  27. bk_reg01 *reg01 = (bk_reg01 *)&shadowRegisters[REG01]; //  1


创建2个联合体变量类型,里面通过结构体存在一个16位数据的不同位段变量,比如高字节和低字节。
这样既可以一次性操作这个16位的变量,还可以分别操作高8位和低8位。
然后定义一个数组用于存储两个变量类型对应的变量实体。
通过取地址符号&取出数组成员的实际地址,并通过强制转换转换为上面两个变量类型的地址类型。
并赋值给两个对应变量类型的指针。即指针里装有这两个实体变量的地址。
后面就可以通过reg00->deviceId 直接操作,也可通过reg00->refined.lowByte来操作低8位。
 楼主| xuanhuanzi 发表于 2024-3-22 21:34 | 显示全部楼层
你们这样用过吗
 楼主| xuanhuanzi 发表于 2024-3-22 21:35 | 显示全部楼层

例如头文件中有很多这种用法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
guijial511 发表于 2024-3-23 10:35 来自手机 | 显示全部楼层
C语言的指针应用是最难的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2307

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

183

主题

2307

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部