写点什么

浅论结构体与联合体

用户头像
Integer
关注
发布于: 2021 年 04 月 09 日

前言

鵺之城的朋友们早上好,我是你们的好哥们 Xeler!昨天呢,我们在 bit 哥的群里聊天吹水,忽然有一位精神小伙冒出来喊了我一声:



我一看,嗬,好学!学,必须学,学大个的。于是连夜写了这篇文。(才不是因为日更活动没稿水了呢)

结构体

言归正传,C 语言中的结构体事实上就是一个组合,它将变量们按照一定的顺序组合起来,大概长这个样子


struct 结构体名字{  int 变量A,变量B;  char[] 变量C;}结构体变量名1,结构体变量名2...;
复制代码


整个声明结构大概分为关键字部分、类型名、结构体块和变量名四个部分,其中除了关键字部分和大括号以外的三个部分都可以省略(就是说你可以写成这个样子也不会报错)


struct{};
复制代码


当然没什么意义就是了类型名和结构体变量名的命名规范我们暂且按下不表(因为和普通的变量名命名规则一致,只要不重复就 OK),具体变量的规则也讲得很明晰了,我们来讨论一下声明之外的三个小点:

使用

一般情况下,变量分为声明、赋值和调用三种使用途径,struct 也不例外


声明:struct 结构体名字 变量名; 或 struct 结构体名字 变量名 = {A的值,B的值};赋值:同类型之间可以直接使用=,否则只能采取下面的方式对成员变量依次赋值调用成员:(设该成员是个int)结构体变量名.成员变量名 = 10;int A = 结构体变量名.成员变量名;
复制代码


另一方面,struct 还有一个比较特别的点

内存对齐

大部分的计算机系统对内存访问都是有所限制的,他们一般会要求这些数据的起始地址必须是一个特定数值的倍数(即字节),例如 4 或是 8,这就是传说中的内存对齐。而这个特定的数值则被我们称作对齐模数(你愿意也可以叫魔数)。有些童鞋可能想问了,这么做有什么好处吗?答案是还真有:这种强制的要求一方面可以简化总线的设计(因为只需要考虑固定个数的数据传输)、一方面也有利于内存设计的简化(理由也同上)。而这个机制反应在 C 语言中,就是结构体的两条递进式的规则:一、结构体的长度只能是对齐模数的倍数二、在前者基础上,变量不能横跨一个对齐模数两端只要记住这两条规则,那么在绝大部分的时间里,你都不会被 sizeof(struct A)所困扰。

typedef

还记得我们之前在指针里提到过的,typedef 极大程度上的简化了 C 语言的声明吗,在这里也是同理,我们在正常声明的时候需要在结构体类型名前面使用一个 struct 关键字,而是用 typedef 后可以化简去这个部分。根据 typedef 的语法规则,大概是长成这个样子:


typedef struct 结构体类型名{  ......}新结构体类型名;
复制代码


这样,当我们需要使用的时候,就可以直接以类似这样:


新结构体类型名 A,B,C;
复制代码


的方式声明一个结构体了,不过夏哥在这里推荐各位小伙伴还是不要轻易是用 typedef,因为有的时候 struct 关键字能够向你提示某些至关重要的信息(夏哥就曾经被这关键字救过一次命)。

联合体

在学习完 struct 之后,union 的知识就显得乏善可陈了 union 占用的内存长度是其中最长的成员长度——他们共享一块内存,union 更多的使用于嵌入式开发,主要是为了截断内存。在设计意义上来说也可以用于泛型,但是用途并不是那么广泛。除此之外,union 和 struct 几乎没有不同。

发布于: 2021 年 04 月 09 日阅读数: 12
用户头像

Integer

关注

生年不满百,何怀千岁忧 2021.03.30 加入

C/C++工程师,专门研究犄角旮旯里的DeadTechnology

评论

发布
暂无评论
浅论结构体与联合体