C语言 自定义类型 之 【联合体(共用体)】

简介: C语言 自定义类型 之 【联合体(共用体)】

前言


联合体union)在C语言中是不常用的,不过存在就必然有其有用之处,这里不深入探讨联合体用在何处有什么用,本文章只介绍关于union的基本知识。


联合体(UNION)类型的定义


联合体也是一种特殊的自定义类型, 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合体也叫共用体)。

例如:

//联合体类型的声明
union Un   // union Un 为联合体类型
{
     // 公用空间的成员
   char c;    
   int i;
};
union Un
{
  char a[5];
  int b;
};  // 注意要有分号

联合体的特点


联合体的成员是共用同一块内存空间的,这样一个联合体变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。


例如这里分别打印ic的地址,会发现他们的地址相同,这是因为他们公用同一块空间的地址:

#include <stdio.h>
union Un
{
  int i;
  char c;
};
union Un un;
int main()
{
  // 下面输出的结果是一样的吗?
  printf("%p\n", &(un.i));
  printf("%p\n", &(un.c));
  return 0;
}


运行结果:



5c17c5f1eaeb43fb95ab2054de76dac1.png


可以看到,他们两个的地址是相同的。

这是因为:


5bb2bea4c8ba4815ae791b1a419f9f24.png


联合体大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
  • 假设这里默认对齐数为8。

例如:

#include <stdio.h>
union Un1
{
  char c[5];
  int i;
};
union Un2
{
  short c[7];
  int i;
};
int main()
{
  //下面输出的结果是什么?
  printf("%d\n", (int)sizeof(union Un1));
  printf("%d\n", (int)sizeof(union Un2));
  return 0;
}

b44a4ef1b27d4ccc8da069755fef6a03.png

联合体使用的典型例题 — 判断机器的大小端


在我之前的这篇http://t.csdn.cn/AKnbz博客中,已经介绍了大小端是什么,这里着重写联合体是怎么判断大小端的。

直接看代码实现:

#include <stdio.h>
union Un
{
  char a;
  int b;
};
//int sys_check();
int main()
{
  union Un u;
  u.b = 1;
  if (u.a == 1)
  {
    printf("小端\n");
  }
  else
  {
    printf("大端\n");
  }
  return 0;
}


9a11da78c9284edb9d122fddee05dc74.png


运行结果:


27d6bebb58b84312ae351e51925f491e.png

可以看到,运用联合体判断出来vs是小端存储模式

调试后观察内存:


12ec1a3abe87456aaf5a74fb2f45e987.png

可以看到,的确为小端存储模式。


写在最后


能够熟练掌握联合体,说不定,在以后的某个时间就用上了呢。

到这里,C语言自定义类型的介绍结束了,一共有三大块:结构体类型,枚举类型,联合体类型。

以下是我写的结构体和枚举的博客链接,欢迎阅读噢:

结构体:http://t.csdn.cn/IRpyh

枚举:http://t.csdn.cn/aeh10


感谢阅读本小白的博客,错误的地方请严厉指出噢!

相关文章
|
5月前
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
43 3
|
5月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
5月前
|
存储 编译器 Linux
C语言——自定义类型
C语言——自定义类型
|
5月前
|
存储 编译器 Linux
深入理解 C 语言中的联合体
深入理解 C 语言中的联合体
|
5月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
7月前
|
存储 安全 编译器
C语言自定义类型
C语言自定义类型
44 10
|
7月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
67 1
|
9月前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
90 7
|
9月前
|
存储 编译器 C语言
C语言的联合体:一种节省内存的数据结构
C语言的联合体:一种节省内存的数据结构
|
9月前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
54 0