C语言 共用体

共用体是一种特殊的数据结构,允许在同一内存位置存储不同的数据类型。与结构体不同,结构体中的每个成员都有独立的内存空间,而共用体的所有成员共享同一块内存空间。

共用体的基本概念

共用体使用关键字 union 来定义,它允许在相同的内存地址上存储不同类型的数据。这使得共用体在某些特定的应用场景下非常有用,比如节省内存空间或者实现类型转换。

定义共用体

定义一个共用体类型的语法如下:

例如,定义一个名为 Data 的共用体,可以存储整型、浮点型和字符型数据:

在这个例子中,Data 共用体有三个成员:整型变量 i、浮点型变量 f 和字符串数组 str。需要注意的是,这些成员共享同一个内存位置。

使用共用体

定义共用体变量的方法与定义结构体变量类似,但需要使用 union 关键字。例如:

这行代码创建了一个名为 data 的共用体变量,可以存储上面定义的任意一种类型的数据。

访问共用体成员

访问共用体成员的方式与结构体相同,使用点运算符(.)。但是,在任何时候,共用体只能存储一种类型的数据,因此在访问之前,应该清楚当前共用体存储的是哪种类型的数据。

例如:

在上述代码中,我们首先将一个整型值赋给了 data,然后输出了这个整型值。接着,我们将一个浮点型值赋给了 data,并输出了这个浮点型值。请注意,由于共用体共享同一块内存,因此在改变成员的值时,其他成员的值也会受到影响。

共用体与内存

共用体的所有成员共享同一段内存空间,因此共用体所占的内存大小等于其最大成员的大小。例如,上面定义的 Data 共用体,其大小取决于 str 数组,因为它是最大的成员。

-- -------------------- ---- -------
----- ---- -
    --- --
    ----- --
    ---- --------
--

--- ------ -
    ----- ---- -----
    ------------ -- ----- ----- --- --------- -------------- -- ----
-

在这个例子中,sizeof 运算符返回 Data 共用体的大小为20字节,这是 str 数组的大小。

共用体的实际应用

共用体在某些特定的应用场景中非常有用,例如在处理不同格式的数据时,可以使用共用体来节省内存空间。此外,共用体还可以用来实现类型转换。

示例:实现类型转换

假设我们需要在程序中处理不同类型的数据,同时希望尽可能减少内存消耗。这时,我们可以使用共用体来实现:

-- -------------------- ---- -------
-------- ---------

----- --------- -
    --- --
    ----- --
--

--- ------ -
    ----- --------- ----

    ----- - --
    --------------- ------ --- ----- ------ ------ ------ ------- -- -------

    ----- - -------
    --------------- ------ --- ----- ------ ------ ------ ------- -- ------------

    ------ --
-

在这个示例中,我们定义了一个 MixedType 共用体,它可以存储整型或浮点型数据。通过改变共用体成员的值,可以看到不同成员之间的值会相互影响。

示例:内存对齐

共用体的一个重要特性是所有成员共享同一块内存空间,这意味着共用体成员的内存对齐方式可能会导致一些意外的结果。了解内存对齐对于正确使用共用体非常重要。

-- -------------------- ---- -------
-------- ---------

----- ----------- -
    ----- --
    --- --
--

--- ------ -
    ----- ----------- ------

    ------------ -- ----- ------------ --- --------- --------------- -- ---
    ------- - -------
    ------------- -- - -------- -------- --------- -- --------
    ------------- -- - ------ -------- --------- -- ------------

    ------ --
-

在这个示例中,我们定义了一个 MemoryAlign 共用体,它可以存储短整型或整型数据。虽然 i 是整型,但它只占用2个字节的内存空间。因此,当我们将 s 赋值后,再读取 i 时,得到的是 s 的低16位加上默认填充的高16位。

总结

共用体是一种强大的工具,能够在同一块内存位置存储不同类型的数据。尽管它在某些情况下非常有用,但也可能导致一些难以预料的行为,特别是在处理不同类型的数据时。理解共用体的工作原理对于编写高效且正确的C语言程序至关重要。

上一篇: C语言 结构体
下一篇: C语言 位域
纠错
反馈