良许Linux教程网 干货合集 嵌入式C语言结构体为什么那么重要?

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

C语言作为编程领域的传奇语言已有50多年的历史,并且至今仍然处于领先地位。近年来,通过观察TIOBE编程语言排行榜,我们可以清晰地看到C语言的地位。不论是排名第一还是第二,C语言都几乎无与伦比。

在排行榜上,C语言已经超越了曾经的霸主JAVA,仅次于Python,稳居第二的位置。这表明了C语言在编程社区中的持久影响力和广泛应用。

image-20240331215903871
image-20240331215903871

2023-09 TIOBE编程语言排行榜

而本文将讲述的C语言中结构体,就是C语言这么多年经久不衰的关键。

为什么这么说呢,因为结构体是C语言中常用的一种数据结构,也是C语言中重要的一部分内容。

C语言保持了代码高效和低代码的特性,也通过结构体延续了面向对象的特性。可以说,C语言缺失了结构体,就缺失了灵魂。

这里重点说下C结构体在嵌入式项目中的一些常见用法。

关于结构体

在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。

image-20240331220005328
image-20240331220005328

结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型。

结构体的定义如下所示:

 struct tag { member-list } variable-list; 

其中:

  • struct为结构体关键字;
  • tag为结构体的标志;
  • member-list为结构体成员列表,其必须列出其所有成员;
  • variable-list为此结构体声明的变量。

在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。

结构体常规定义

不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。

方法1:

定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.

struct stu
{
    char  aa;
    short bb;
    int   cc;
};

struct stu stu1, stu2;

方法2:

定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.

struct stu
{
    char  aa;
    short bb;
    int   cc;
}stu1, stu2;

struct stu stu3;

方法3:

定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。

struct
{
    char  aa;
    short bb;
    int   cc;
}stu1, stu2;

提示:

这里不能像上面再定义结构体变量:(以下错误)

struct stu3; 
struct stu stu3;

使用typedef定义结构体

这里先简单说下typedef:

 

在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。

方法4:

使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。

typedef struct stu
{
    char  aa;
    short bb;
    int   cc;
}STU;

STU stu1;

你会发现,其实就是通过关键字typedef,将STU取代了struct stu。

当然,也可以这么用:

struct stu stu1;

上面这种定义就失去了typedef的意思,所以不推荐。

方法5:

使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。

typedef struct
{
    char  aa;
    short bb;
    int   cc;
}STU;

STU stu1;

方法6:

还有一种符合语法规则,但意义不大的定义方式。

typedef struct stu
{
    char  aa;
    short bb;
    int   cc;
};

struct stu stu1;

以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。

结构体大小计算

结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。

1.对比两结构体大小,一样吗?

结构体1:

struct stu
{
    char  aa;
    short bb;
    char  cc;
}stu1;

结构体2:

struct stu
{
    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,原理一样。

最后,强调一下,学习编程,不能只看书,动手敲代码才能快速提升自己。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部