打印
[PIC®/AVR®/dsPIC®产品]

联合体与结构体的指针用法

[复制链接]
260|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
typedef union
{
    struct
    {
        uint8_t lowByte;
        uint8_t highByte;
    } refined;
    uint16_t deviceId;
} bk_reg00;

/**
* @ingroup GA01
* [url=home.php?mod=space&uid=247401]@brief[/url] Chip ID
*
*/
typedef union
{
    struct
    {
        uint8_t lowByte;
        uint8_t highByte;
    } refined;
    uint16_t chipId;
} bk_reg01;


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

// Device registers map - References to the shadow registers
bk_reg00 *reg00 = (bk_reg00 *)&shadowRegisters[REG00]; //  0
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语言的指针应用是最难的

使用特权

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

本版积分规则

155

主题

2084

帖子

2

粉丝