结构体是C语言编程里面非常重要的一个数据结构也属于一种复合数据类型用关键字struct来表示是由一批数据组合而成的结构型数据而每个数据我们可以称之为结构体的成员或者域或者元素。那什么情况下适合用结构体来封装一些数据呢如果要表示的数据存在一定的关联性就可以尝试用结构体来封装。我们先来举几个简单的例子对于某一种水果的相关属性定义比如颜色、形状、价格及产地等对于某种具体的通信协议帧数据内容比如帧头帧尾长度数据及校验码等对于某个设备的一些状态错误或故障信息比如超温报警掉电报警及超阈值报警等还有MCU外设相关的定义等等反正只要存在整体-局部关系或者要表示的属性相似的时候你都可以用结构体来实现。那怎么样定义结构体比较好呢可以按如下方式定义struct结构体名称{结构体成员}结构体变量1如果要再定义结构体变量2可以按如下方式struct 结构体名称 结构体变量2上面这种方式在每次新增结构体变量时都要加上struct关键字声明略显繁琐因此我们可以用typedef来简化结构体的定义方式typedef struct{结构体成员}结构体名要定义结构体变量时按如下方式即可结构体名 结构体变量可以看看MCU固件库基本上都是用这种方式来定义结构体的USART_InitTypeDef USART_InitStructure;其中结构体变量可以为普通结构体变量可以为结构体指针可以为结构体数组结构体名 struct_variable;结构体名 *pStructVariable;结构体名 struct_variable[10];结构体成员可以是普通数据类型也可以是结构体和联合体等复合数据类型。有时候对于内存空间资源比较紧张或者想让结构体成员变量指示的更加明显的情况下在定义结构体时还可以加入位域bit fields操作所谓位域是C语言中用于优化内存占用的数据结构通过在结构体或联合体声明中使用冒号语法指定成员的位宽将多个逻辑信息压缩存储至单个整型单元。即在成员变量后面加上“:位域大小”来定义该成员变量占用几位bit如下所示复制typedefstruct{unsignedintis_active :1;//只占1位unsignedintage :7;//占7位unsignedintgender :1;//只占1位} CompactPerson;这样可以达到有效节约内存空间的目的也会让成员变量的数据范围变的更加直观。另外还可以通过结构体对齐方式来优化结构体所占的字节数我们举例说明吧。先来看看下面这个结构体定义方式所占的字节数复制typedefstruct{charc;//1字节inti;//4字节chard;//1字节}Example;如果按照成员变量所占字节数相加来计算Example结构体应该是占用6字节的对吧但是实际呢为什么是占用12字节呢我们知道对于32位MCU来说一个内存地址是存储4字节数据为了提高程序运行效率系统是会考虑到内存对齐操作的即第一个成员变量c只有1字节不够4字节那编译器通常会在此处添加3个填充字节第三个成员变量d也是一样这样结构体所占字节总数即为12字节在内存中的存储结构如下c: 1字节填充 3字节i: 4字节d: 1字节填充 3字节也就是结构体所占字节数肯定是4字节的整数倍对于32位MCU。那怎么优化呢可以尝试按成员变量本身所占字节数大小的降序方式进行排列来定义复制typedefstruct{inti;//4字节charc;//1字节chard;//1字节}Example;再测试看一下结构体所占字节数变成了8字节较之前的定义方式减少了4字节是不是很好在内存中的存储结构如下i: 4字节c: 1字节d: 1字节填充 2字节如果你使用的结构体比较多或者里面定义的成员比较多还是有必要做一些结构体定义方式的优化操作的。此外还可以通过使用联合体来共享内存空间其实在结构体中嵌套联合体是比较常见的C编码技巧在MCU外设库里也是应用比较多的此时联合体的所有成员是共享同一块内存空间的并且其大小为最大成员的大小这种操作可以有效节约内存空间比较适用于同一时刻只需要使用其中某一个成员的场景。以下在结构体Packet里定义了一个联合体成员data可以根据type决定使用哪个成员复制typedefstruct{inttype;//类型标签union{intintValue;floatfloatValue;charstringValue[6];}data;}Packet;可以按如下方式来使用Packet p;p.type 1;p.data.floatValue 3.1415f; // 此时联合体存储的是float最后对成员变量定义合理的数据类型也是非常重要的不要想当然的从头至尾全是一种数据类型。以上通过对结构体的定义方式和实测说明讲解了一下如何更加有效地定义结构体。。---------------------作者dffzh链接https://bbs.21ic.com/icview-3468132-1-1.html?_dsign7421db86来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。