结构体(Struct)与联合体(Union)的区别

一、定义和用法

结构体(Struct)和联合体(Union)是C语言中同属于复合数据类型的一种类型,两者都可以封装多个不同类型的数据,但是却有着显著的不同之处。

1. 结构体的定义和用法

结构体是一种用户定义的数据类型,它可以用来封装多个不同类型的数据。通常情况下,结构体成员被设计为具有不同的数据类型。结构体通常被用来代表一个数据对象,例如汽车、学生、员工等等。C语言中结构体由多个成员组成,每个成员可以是不同类型的数据。


struct car {
    char brand[20];
    char model[20];
    int year;
    float price;
};

上述代码定义了一个名为car的结构体,它包含四个成员,分别是char类型的brand和model、int类型的year和float类型的price。我们可以使用结构体来表示一辆汽车。

2. 联合体的定义和用法

联合体是一种特殊的结构体,它的所有成员共享同一段内存。联合体的所有成员使用同一份内存空间,所以修改其中某一个成员的值,会影响到另一个成员的值。联合体通常被用来节省内存,例如有一些数据只用到其中一个成员。


union data {
    int integer;
    float decimal;
};

上述代码定义了一个名为data的联合体,它包含了两个成员,一个是int类型的integer,另一个是float类型的decimal,它们占据同一段内存空间。我们可以使用联合体来表示一个数据,可以是一个整数或者是一个浮点数。

二、内存布局

结构体和联合体的内存布局也有着非常大的区别。

1. 结构体的内存布局

结构体的内存布局是将每个成员单独分配内存,并依次排列。每个成员在内存中的地址都是连续的,各成员之间在内存中没有任何关联。


struct car {
    char brand[20];
    char model[20];
    int year;
    float price;
};

struct car mycar;

上述代码定义了一个名为mycar的结构体变量。

内存图:


    0          20              40          44
 +----------+----------------+----------+----------+
 |   brand  |     model      |   year   |   price   |
 +----------+----------------+----------+----------+
 |                                                       |
 mycar

在内存中,四个成员按照定义的顺序被依次排列。用sizeof运算符可以计算结构体的大小(单位为字节)。


printf("%zu", sizeof(mycar)); // 输出:44

2. 联合体的内存布局

联合体的内存布局只分配联合体中最大的成员所需要的内存空间,不管其他的成员的大小是多少。每个成员在内存中的地址都是相同的。


union data {
    int integer;
    float decimal;
};

union data mydata;

上述代码定义了一个名为mydata的联合体变量。

内存图:


   0-3    4-7
 +-------+
 |integer|   4 bytes
 +-------+
   OR
 +-------+
 |decimal|   4 bytes
 +-------+
 mydata

在内存中,union中仅分配了4个字节的空间,不管是integer还是decimal都使用这4个字节,因此,修改一个成员会影响到另外一个成员。


mydata.integer = 12;
printf("%d, %f", mydata.integer, mydata.decimal); // 输出:12, 0.000000

mydata.decimal = 23.45;
printf("%d, %f", mydata.integer, mydata.decimal); // 输出:1093507190, 23.450001

三、应用场景

1. 结构体的应用场景

结构体通常被用来封装多个相关类型的数据,使得这些数据可以统一管理,方便使用。例如,用结构体来表示一个学生信息。


struct student {
    char name[20];
    int age;
    char gender[6];
};

2. 联合体的应用场景

联合体通常被用来在一段内存空间中同时表示多个数据类型,这些数据类型在不同的时间和场合下只有一个会被使用。例如,用联合体来表示数据类型转换。


union data {
    int integer;
    float decimal;
};

void swap(union data *a, union data *b) {
    union data temp = *a;
    *a = *b;
    *b = temp;
}

union data d1, d2;
d1.integer = 12345;
d2.decimal = 67.89;

swap(&d1, &d2);

printf("%d, %f", d1.integer, d2.decimal); // 输出:1090873190, 12345.000000

四、小结

结构体和联合体是C语言中的两种复合数据类型,结构体将多个不同类型的成员按顺序排列在一起,并分配不同的内存空间;联合体将多个数据类型的成员共享同一段内存,以节省内存空间。两者在应用场景上也有所不同,需要根据实际需求选择使用。

原创文章,作者:STKNP,如若转载,请注明出处:https://www.506064.com/n/333929.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
STKNPSTKNP
上一篇 2025-02-01 13:34
下一篇 2025-02-05 13:04

相关推荐

  • Python中new和init的区别

    new和init都是Python中常用的魔法方法,它们分别负责对象的创建和初始化,本文将从多个角度详细阐述它们的区别。 一、创建对象 new方法是用来创建一个对象的,它是一个类级别…

    编程 2025-04-29
  • Sublime Test与Python的区别

    Sublime Text是一款流行的文本编辑器,而Python是一种广泛使用的编程语言。虽然Sublime Text可以用于编写Python代码,但它们之间有很多不同之处。接下来从…

    编程 2025-04-29
  • Shell脚本与Python脚本的区别

    本文将从多个方面对Shell脚本与Python脚本的区别做详细的阐述。 一、语法差异 Shell脚本和Python脚本的语法存在明显差异。 Shell脚本是一种基于字符命令行的语言…

    编程 2025-04-29
  • Python中while语句和for语句的区别

    while语句和for语句是Python中两种常见的循环语句,它们都可以用于重复执行一段代码。然而,它们的语法和适用场景有所不同。本文将从多个方面详细阐述Python中while语…

    编程 2025-04-29
  • Web程序和桌面程序的区别

    Web程序和桌面程序都是进行软件开发的方式,但是它们之间存在很大的区别。本文将从多角度进行阐述。 一、运行方式 Web程序运行于互联网上,用户可以通过使用浏览器来访问它。而桌面程序…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29
  • TensorFlow和Python的区别

    TensorFlow和Python是现如今最受欢迎的机器学习平台和编程语言。虽然两者都处于机器学习领域的主流阵营,但它们有很多区别。本文将从多个方面对TensorFlow和Pyth…

    编程 2025-04-28
  • 麦语言与Python的区别

    麦语言和Python都是非常受欢迎的编程语言。它们各自有自己的优缺点和适合的应用场景。本文将从语言特性、语法、生态系统等多个方面,对麦语言和Python进行详细比较和阐述。 一、语…

    编程 2025-04-28
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28

发表回复

登录后才能评论