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

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

前言

本篇文章我们再来讨论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];
};

nt 类型大小为 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 标签,提供更清晰的代码流程控制。


总结

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


相关文章
|
4天前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
6天前
|
存储 机器学习/深度学习 编译器
C语言基础简单教程
C语言基础简单教程
|
7天前
|
IDE 编译器 开发工具
C语言教程:如何进行环境搭建
C语言教程:如何进行环境搭建
|
7天前
|
搜索推荐 编译器 C语言
C语言的简单教程
摘要: 了解C语言中的注释,包括//单行和/*多行*/注释,注意不要嵌套。使用快捷键Ctrl + K, Ctrl + C/U处理注释。C语言的关键字如'int'和'return'有特定含义,通常小写且高亮显示。常量是不可变的,分为不同类型。练习涉及识别不同类型的常量,如整型、实型和字符型。使用printf通过占位符输出常量,例如`printf("%d", 10)`。作业包括根据占位符输出个性化信息,如学校名字、高考分数和女朋友的详细信息,并掌握在不同情况下使用\n进行换行。
|
19天前
|
数据库 C语言
C语言进阶 文件操作知识(上)
C语言进阶 文件操作知识(上)
14 3
|
19天前
|
存储 C语言
C语言进阶 文件操作知识(下)
C语言进阶 文件操作知识(下)
17 2
|
2天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
10 0
|
5天前
|
存储 C语言 C++
【C语言刷题系列】水仙花数的打印及进阶
【C语言刷题系列】水仙花数的打印及进阶
|
24天前
|
C语言
C语言进阶——sprintf与sscanf、文件的随机读写(fseek、ftell、rewind)
C语言进阶——sprintf与sscanf、文件的随机读写(fseek、ftell、rewind)
10 0
|
1天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数