• C 语言共用体(Union)


    C 语言共用体(Union)

    在本教程中,您将学习C语言编程中的共用体。更具体地说,如何创建共用体(联合体),访问其成员以及了解共用体与组织之间的差异。共用体又被称为联合体, 和结构体同属于C语言数据类型中的结构类型。

    共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

    union也是一种用户定义的类型,类似于C中的struct,除了一个关键字的区别。结构体分配足够的空间存储其所有成员,而共用体分配空间仅存储最大的成员。

    如何定义共用体?

    我们使用union关键字定义共用体。这是一个实例:

    union car
    {
      char name[50];
      int price;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面的代码定义了派生类型union car。

    创建union变量

    定义共用体后,它将创建用户定义的类型。但是,没有分配内存。要为给定的联合类型分配内存并使用它,我们需要创建变量。

    这是我们创建联合变量的方法。

    union car
    {
      char name[50];
      int price;
    };
    
    int main()
    {
      union car car1, car2, *car3;
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    创建联合变量的另一种方法是:

    union car
    {
      char name[50];
      int price;
    } car1, car2, *car3;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这两种情况下,都会创建union car类型的union变量car1、car2和union指针car3。

    访问共用体成员

    我们使用.运算符来访问共用体的成员。要访问指针变量,我们还使用->运算符。

    在上面的示例中,

    • 要访问car1的价格(price),请使用car1.price。
    • 要访问car3的价格(price),可以使用(* car3).price或car3-> price。

    共用体与结构体之间的区别

    让我们以一个实例来说明共用体与结构体之间的区别:

    #include 
    union unionJob
    {
       //定义 union
       char name[32];
       float salary;
       int workerNo;
    } uJob;
    
    struct structJob
    {
       char name[32];
       float salary;
       int workerNo;
    } sJob;
    
    int main()
    {
       printf("union 的大小 = %d 字节", sizeof(uJob));
       printf("\nstruct 的大小 = %d 字节", sizeof(sJob));
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出结果

    union 的大小 = 32 字节
    structure 的大小  = 40 字节
    
    • 1
    • 2

    为什么联合变量和结构变量的大小存在这种差异?

    在这里,sJob大小为40个字节,因为

    • name[32]的大小是32个字节
    • salary的大小是4个字节
    • workerNo的大小是4个字节

    但是,uJob大小为32个字节。这是因为联合变量的大小将始终是其最大元素的大小。在上面的示例中,其最大元素(name[32])的大小为32个字节。

    使用共用体,所有成员共享相同的记忆

    示例:访问共用体会员

    #include 
    union Job {
       float salary;
       int workerNo;
    } j;
    
    int main() {
       j.salary = 12.3;
    
        //当j.workerNo被赋值时,
        // j.salary将不再保留12.3
       j.workerNo = 100;
    
       printf("薪水 = %.1f\n", j.salary);
       printf("工人人数 = %d", j.workerNo);
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出结果c

    薪水 = 0.0
    工人人数 = 100
    
    • 1
    • 2
  • 相关阅读:
    C++ --- Day04 继承
    OpenGL ES 名词解释(二)
    CF 1708A/数学思维
    javaweb笔记一
    要真正实现产业互联网,必然需要有一定的基础和条件才能实现
    SpringMVC简单介绍与使用
    STM32的GPIO端口的八种模式解析
    贪心算法找零问题
    Selenium定位之find_element方法
    ObjectARX简单自定义实体的实现
  • 原文地址:https://blog.csdn.net/Tom_Jerry__/article/details/134524731