信任咱们关于结构体都不生疏。在此,共享出自己对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部分结构体成员变量内存对齐中具体阐明。