电子产业一站式赋能平台

PCB联盟网

搜索
查看: 25|回复: 0
收起左侧

嵌入式C语言结构体为什么那么重要?

[复制链接]

666

主题

666

帖子

8835

积分

高级会员

Rank: 5Rank: 5

积分
8835
发表于 2025-5-6 11:45:00 | 显示全部楼层 |阅读模式
关注+星标公众,不错过精彩内容

e1i23efkhcp6404450201.jpg

e1i23efkhcp6404450201.jpg

作者 | strongerHuang
微信公众号 | 嵌入式专栏
C语言问世50多年,可谓是编程界的传奇语言,目前依然遥遥领先。
而本文将讲述的C语言中结构体,就是C语言这么多年经久不衰的关键。
为什么这么说呢,因为结构体是C语言中常用的一种数据结构,也是C语言中重要的一部分内容。
C语言保持了代码高效和低代码的特性,也通过结构体延续了面向对象的特性。可以说,C语言缺失了结构体,就缺失了灵魂。
这里重点说下C结构体在嵌入式项目中的一些常见用法。
关于结构体
在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。

igptxkzryqy6404450301.jpg

igptxkzryqy6404450301.jpg

结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型。
结构体的定义如下所示:
  • struct tag { member-list } variable-list;
    其中:
  • struct为结构体关键字;
  • tag为结构体的标志;
  • member-list为结构体成员列表,其必须列出其所有成员;
  • variable-list为此结构体声明的变量。
    在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。
    结构体常规定义
    不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。
    方法1:
    定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.
  • structstu{char  aa;short bb;    int   cc;};
    structstustu1, stu2;
    方法2:定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.
  • structstu{char  aa;short bb;    int   cc;}stu1, stu2;
    structstustu3;
    方法3:定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。
  • struct{char  aa;short bb;    int   cc;}stu1, stu2;
    提示:这里不能像上面再定义结构体变量:(以下错误)
  • struct stu3; structstustu3;
    使用typedef定义结构体
    这里先简单说下typedef:
    在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。
    方法4:使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。
  • typedefstructstu{char  aa;short bb;    int   cc;}STU;
    STU stu1;
    你会发现,其实就是通过关键字typedef,将STU取代了struct stu。
    当然,也可以这么用:
  • structstustu1;上面这种定义就失去了typedef的意思,所以不推荐。
    方法5:使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。
  • typedefstruct{char  aa;short bb;int   cc;}STU;
    STU stu1;
    方法6:还有一种符合语法规则,但意义不大的定义方式。
  • typedefstructstu{char  aa;short bb;int   cc;};
    structstustu1;
    以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。
    结构体大小计算
    结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。
    1.对比两结构体大小,一样吗?结构体1:
  • structstu{char  aa;short bb;char  cc;}stu1;
    结构体2:
  • structstu{char  aa;char  bb;short cc;}stu2;
    答案是不一样。程序测试得出sizeof(stu1)=6, sizeof(stu2)=4.
    2.分析不一样原因
    结构体计算要遵循字节对齐原则,一般满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节;
    对于上面结构体stu1来说,最大字节:2字节,顺序是 char->short->char:
    第一个char占一个字节多的这一个补0,只是占位作用
    short 刚好占2个字节
    第二个char也占1个多的这一个补0

    对于上面结构体stu2来说,最大字节:2字节,顺序是 char->char->short:
    第一个char占一个字节第二个char占一个字节
    short 刚好占2个字节

    通过上面两个表格,相信你应该明白了,改成4字节的int,原理一样。
    最后,强调一下,学习编程,不能只看书,动手敲代码才能快速提升自己。
    ------------ END ------------

    1xqo15uyaes6404450401.gif

    1xqo15uyaes6404450401.gif


    ●专栏《嵌入式工具
    ●专栏《嵌入式开发》
    ●专栏《Keil教程》
    ●嵌入式专栏精选教程

    关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
    点击“阅读原文”查看更多分享。
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条


    联系客服 关注微信 下载APP 返回顶部 返回列表