您的位置 首页 知识

闲谈c言语结构体

相信大家对于结构体都不陌生。在此,分享出本人对C语言结构体的研究和学习的总结。如果你发现这个总结中有你以前所未掌握的,那本文也算是

信任咱们关于结构体都不生疏。在此,共享出自己对C言语结构体的研讨和学习的总结。假设你发现这个总结中有你以前所未把握的,那本文也算是有点价值了。当然,水平有限,若发现不足之处恳请指出。代码文件test.c我放在下面。

在此,我会环绕以下2个问题来剖析和使用C言语结构体:

1.C言语中的结构体有何效果

2.结构体成员变量内存对齐有何考究(要点)

关于一些概念的阐明,我就不把C言语教材上的界说搬上来。咱们坐下来渐渐聊吧。

==============================================================================================================================================

1.结构体有何效果

三个月前,教研室里一个学长在华为南京研讨院的面试中就遇到这个问题。当然,这仅仅面试中最根底的问题。假设问你你怎样答复?

我的了解是这样的,C言语中结构体至少有以下三个效果:

(1)有机地组织了目标的特点。

比方,在STM32的RTC开发中,咱们需求数据来表明日期和时刻,这些数据通常是年、月、日、时、分、秒。假设咱们不必结构体,那么就需求界说6个变量来表明。这样的话程序的数据结构是松懈的,咱们的数据结构最好是“高内聚,低耦合”的。所以,用一个结构体来表明更好,无论是从程序的可读性仍是可移植性仍是可保护性皆是:

typedefstruct//公历日期和时刻结构体

{

vu16 year;

vu8 month;

vu8 date;

vu8hour;

vu8min;

vu8sec;

}_calendar_obj;

_calendar_objcalendar;//界说结构体变量

(2)以修正结构体成员变量的办法替代了函数(进口参数)的从头界说。

假设说结构体有机地组织了目标的特点表明结构体“中看”,那么以修正结构体成员变量的办法替代函数(进口参数)的从头界说就表明了结构体“顶用”。持续以上面的结构体为比如,咱们来剖析。假设现在我有如下函数来显现日期和时刻:

voidDsipDateTime(_calendar_objDateTimeVal)

那么咱们只要将一个_calendar_obj这个结构体类型的变量作为实参调用DsipDateTime()即可,DsipDateTime()经过DateTimeVal的成变量来完成内容的显现。假设不必结构体,咱们很可能需求写这样的一个函数:

voidDsipDateTime(vu16 year,vu8 month,vu8 date,vu8hour,vu8min,vu8sec)

明显这样的形参很不可观,数据结构管理起来也很繁琐。假设某个函数的回来值得是一个表明日期和时刻的数据,那就更杂乱了。这仅仅一方面。

另一方面,假设用户需求表明日期和时刻的数据中还要包括星期(周),这个时分,假设之前没有用组织体,那么应该在DsipDateTime()函数中在添加一个形参vu8week:

voidDsipDateTime(vu16 year,vu8 month,vu8 date,vu8week,vu8hour,vu8min,vu8sec)

可见这种办法来传递参数十分繁琐。所以以结构体作为函数的进口参数的优点之一便是

函数的声明voidDsipDateTime(_calendar_objDateTimeVal)不需求改动,只需求添加结构体的成员变量,然后在函数的内部完成上对calendar.week作相应的处理即可。这样,在程序的修正、保护方面效果明显。

typedefstruct//公历日期和时刻结构体

{

vu16 year;

vu8 month;

vu8 date;

vu8 week;

vu8hour;

vu8min;

vu8sec;

}_calendar_obj;

_calendar_objcalendar;//界说结构体变量

(3)结构体的内存对齐准则能够进步CPU对内存的拜访速度(以空间交换时刻)。
而且,结构体成员变量的地址能够依据基地址(以偏移量offset)核算。咱们先来看看下面的一段简略的程序,关于此程序的剖析会在第2部分结构体成员变量内存对齐中具体阐明。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/317697.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部