C语言进阶教程(再论struct,union,enum)

举报
yd_274589494 发表于 2023/11/27 22:24:42 2023/11/27
【摘要】 @TOC 前言本篇文章我们再来讨论struct,union,enum这三大结构。这三大结构很容易让人晕头转向,所以现在我们再来分析一下吧。 一、struct,union,enum类型大小计算1.Struct(结构体):结构体是一种用户自定义的数据类型,用于将一组不同类型的变量组合在一起,作为一个逻辑单元来表示复杂的数据结构。结构体的大小计算取决于其成员变量的大小及对齐方式。为了提高内存访问效...

@TOC


前言

本篇文章我们再来讨论struct,union,enum这三大结构。这三大结构很容易让人晕头转向,所以现在我们再来分析一下吧。

一、struct,union,enum类型大小计算

1.Struct(结构体):
结构体是一种用户自定义的数据类型,用于将一组不同类型的变量组合在一起,作为一个逻辑单元来表示复杂的数据结构。结构体的大小计算取决于其成员变量的大小及对齐方式。为了提高内存访问效率,编译器会根据对齐原则在结构体中添加填充字节,使得结构体的大小成为成员变量大小的倍数。

结构体大小计算的一个常见规则是成员变量按其定义顺序排列,并且结构体的整体大小是每个成员变量大小的总和。例如,假设有一个结构体如下:

struct Person {
    char name[20];
    int age;
    float height;
};

char 类型大小为 1 字节,name 数组大小为 20 字节。
int 类型大小为 4 字节,age 变量占用 4 字节。
float 类型大小为 4 字节,height 变量占用 4 字节。
结构体大小为对齐后的大小(通常是 4 的倍数)。在这个例子中,结构体 Person 的大小为 32 字节(20 + 4 + 4 + 4)。

2.Union(联合):
联合是一种特殊的数据类型,允许在同一片内存空间中存储不同类型的数据。与结构体不同,联合的大小等于最大成员的大小。

联合的大小计算不涉及对齐,因为联合的所有成员共享相同的内存空间。即使其中一个成员占用了较大的内存空间,联合的大小仍然等于该成员的大小。

下面是一个联合的示例:

union Data {
    int i;
    float f;
    char str[20];
};

int 类型大小为 4 字节,联合的大小也是 4 字节。
float 类型大小为 4 字节,由于联合大小已确定为 4 字节,不会增加。
char 数组大小为 20 字节,也不会增加联合的大小。

Enum(枚举):
枚举是一种用于定义命名常量的数据类型。枚举的大小取决于其底层数据类型,通常为 int 类型大小。每个枚举常量都占用一个整型值。

枚举常量的值可以通过显式指定或自动分配,默认从 0 开始自增。例如:

enum Month {
    JAN = 1,
    FEB,
    MAR,
    APR,
    MAY,
    JUN,
    JUL,
    AUG,
    SEP,
    OCT,
    NOV,
    DEC
};

在上述枚举中,JAN 的值为 1,后续常量依次自增。每个枚举常量占用底层数据类型(通常为 int)的大小。

二、应用场景分析

当涉及到复杂的数据结构、数据对象的表示和处理时,struct、union和enum能够提供很多有用的功能。下面是它们常见的应用场景:

Struct(结构体):
结构体常用于组织和表示复杂的数据结构。它可以将多种不同类型的变量组合在一起,形成一个逻辑单元,以便进行更方便的数据操作和访问。一些常见的应用场景包括:

定义和操作复杂的数据记录或对象,如学生信息、员工信息等。
构建树、图等数据结构,其中每个节点存储不同的数据。
与文件和网络通信时,结构体可以帮助定义消息格式和数据包格式,方便数据的传输和解析。
与硬件交互时,结构体能够方便地表示和处理寄存器、设备状态等信息。

Union(联合):
联合主要用于节省空间和实现数据共享。它允许多个成员变量共享同一片内存空间,同时只有一个成员可以有效地存储数据。一些常见的应用场景包括:

存储和处理多个类型的数据,但同一时间只使用其中一个类型的数据。例如,一个联合可以同时存储整数、浮点数和字符数组,根据需要访问其中之一。
在嵌入式系统中,联合可用于操作硬件寄存器或处理位字段,以便在节省空间的同时实现灵活的数据存储。

Enum(枚举):
枚举主要用于定义一组相关的命名常量,以便在代码中使用更具可读性和可维护性的符号。一些常见的应用场景包括:

定义状态或选项的集合,用于表示不同的程序行为。例如,布尔值的枚举常量 TRUE 和 FALSE 可以用于表示逻辑状态。
枚举在处理离散值时非常有用,例如表示星期几、月份、方向等。
枚举常量可以用作开关语句中的 case 标签,提供更清晰的代码流程控制。

总结

需要注意的是,每个类型在不同的应用场景中可能具有不同的用途。结构体、联合和枚举都提供了灵活的方式来定义和操作自定义类型,以适应不同的编程需求。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。