嵌入式结构体中变量名-冒号+数字(位域表示法)

概述

        在嵌入式开发过程中经常见如下写法:

/** @brief  Device State.*/
typedef struct
{
    uint8_t gap_init_state: 1;  //!< @ref GAP_INIT_STATE
    uint8_t gap_adv_sub_state: 1;  //!< @ref GAP_ADV_SUB_STATE
    uint8_t gap_adv_state: 2;   //!< @ref GAP_ADV_STATE
    uint8_t gap_scan_state: 2;  //!< @ref GAP_SCAN_STATE
    uint8_t gap_conn_state: 2;  //!< @ref GAP_CONN_STATE
} T_GAP_DEV_STATE;

这是结构体中的冒号表示位域。
位域出现的原因是由于某些信息的存储表示只需要几个bit位就可以表示而不需要一个完整的字节,同时也是为了节省存储空间和方便处理。

其表示形式为:
struct 位域结构名

    类型说明符  位域名:位域长度
}

其中 T_GAP_DEV_STATE 表示位域结构体,gap_init_state
、gap_adv_sub_state、gap_adv_state、gap_scan_state、gap_conn_state 表示对应的位域。整个位域结构体占用1个字节,gap_init_state占1位,gap_adv_sub_state占1位,gap_adv_state和gap_scan_state和gap_conn_state分别各占2位。
因1个bytes(字节)是8 bit(bit)。如果结构中定义的类型是u_char,一个字节,共8bit,最大就不能超过8。
32位机下,short是2字节,共16bit,最大就不能超过16。int是4字节,共32bit,最大就不能超过32。

注意:
1、位域必须存储在同一个类型中,不能跨类型,同时也说明位域的长度不会超过所定义类型的长度。如果一个定义类型单元里所剩空间无法存放下一个域,则下一个域应该从下一单元开始存放。例如:所定义的类型是int类型,一共32位,目前用掉了25位还剩下7位,这时要存储一个8位的位域元素,那么这个元素就只能从下一个int类型的单元开始而不会在前面一个int类型中占7为后面的int类型中占1位。
2、如果位域的位域长度为0表示是个空域,同时下一个域应当从下一个字节单元开始存放。
3、使用无名的位域来作为填充和调整位置,切记该位域是不能被使用的。
4、位域的本质上就是一种结构体类型,不同的是其成员是按二进制位来分配的。

C语言结构体是一种用户定义的数据类型,它允许我们将不同类型的数据项组合成一个单一的复合类型。下面是一个简单的例子,说明如何使用结构体来输入和输出学生信息。 首先定义一个学生信息的结构体: ```c #include <stdio.h> // 定义学生信息的结构体 typedef struct { char name[50]; float average_score; } Student; int main() { Student student1; // 声明一个学生信息的结构体变量 Student *student_ptr = &student1; // 声明一个指向学生信息的结构体指针,并指向student1 // 输入学生信息 printf("请输入学生的姓名:"); scanf("%s", student1.name); // 使用"结构体变量名.成员名"的方式输入姓名 printf("请输入学生的平均分:"); scanf("%f", &student1.average_score); // 输入平均分 // 输出学生姓名 printf("(*结构体指针变量名).成员名方式输出:%s\n", (*student_ptr).name); // 输出学生平均分,保留1位小数 printf("结构体指针变量名->成员名方式输出:%f\n", student_ptr->average_score); // 使用printf的格式化功能,保留1位小数 printf("(*结构体指针变量名).成员名方式输出:%0.1f\n", (*student_ptr).average_score); // 使用结构体指针变量名->成员名方式输出姓名和分数,间用全角冒号分隔 printf("%*c%s:%0.1f\n", 12, ' ', student_ptr->name, student_ptr->average_score); return 0; } ``` 在这个例子,我们首先定义了一个`Student`结构体,包含`name`和`average_score`两个成员。在`main`函数,我们创建了一个`Student`类型的变量`student1`和一个指向该类型的指针`student_ptr`。通过`student1`我们可以直接访问结构体成员,而通过`student_ptr`我们需要使用`->`运算符。 程序首先提示用户输入学生的姓名和平均分,然后使用不同的方式输出这些信息。在输出平均分时,我们使用了`%f`和`%0.1f`来控制格式,分别输出默认的小数位数和保留一位小数。在最后使用全角冒号输出时,我们通过在`printf`指定宽度`%*c`,并手动放置一个全角冒号`' '`来实现所需格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch_champion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值