C 语言共用体(Union)

C 语言共用体(Union)

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

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

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

如何定义共用体?

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

c 复制代码
union car
{
  char name[50];
  int price;
};

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

创建union变量

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

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

c 复制代码
union car
{
  char name[50];
  int price;
};

int main()
{
  union car car1, car2, *car3;
  return 0;
}

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

c 复制代码
union car
{
  char name[50];
  int price;
} car1, car2, *car3;

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

访问共用体成员

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

在上面的示例中,

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

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

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

c 复制代码
#include <stdio.h>
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;
}

输出结果

c 复制代码
union 的大小 = 32 字节
structure 的大小  = 40 字节

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

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

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

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

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

示例:访问共用体会员

c 复制代码
#include <stdio.h>
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;
}

输出结果c

c 复制代码
薪水 = 0.0
工人人数 = 100
相关推荐
光子物联单片机2 分钟前
STM32单片机开发入门(十一)STM32CubeIDE下载安装及开发调试说明
c语言·stm32·单片机·嵌入式硬件·mcu
_codemonster37 分钟前
自然语言处理容易混淆知识点(一)c-TF-IDF和TF-IDF的区别
c语言·自然语言处理·tf-idf
deng-c-f1 小时前
C/C++内置库函数(2):智能指针
java·c语言·c++
yuhaiqun19891 小时前
新手练 C++ HTTP 服务实操:从 “拆请求头” 到 “发 HTML 响应”
c语言·c++·程序人生·http·html·学习方法·改行学it
野生风长1 小时前
从零开始的C语言: 指针深入理解从入门到实践(中)指针与数组的结合
c语言·数据结构·算法
EXtreme351 小时前
【数据结构】建堆操作:向上调整与向下调整的数学推导与性能对比
c语言·数据结构··时间复杂度·topk问题·算法分析
zore_c2 小时前
【C语言】Win 32 API——一部分内容详解!!!
c语言·开发语言·c++·经验分享·笔记
良木生香2 小时前
【数据结构-初阶】详解线性表(3)---双链表
c语言·数据结构·蓝桥杯
野生风长2 小时前
从零开始的c语言:指针高级应用(下)(回调函数,qsort函数模拟实现, strlen和sizeof)
java·c语言·开发语言·c++·算法
野生风长2 小时前
从零开始的c语言:初步理解指针—从底层到入门(上)指针概念及语法,指针运算, 传地址和传值
c语言·开发语言·windows·visual studio