暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 坏 幸 运 2023-05-18
594

Table of Contents

前言

联合体(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; }

运行结果:

在这里插入图片描述
可以看到,他们两个的地址是相同的。

这是因为:

在这里插入图片描述

联合体大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
  • 假设这里默认对齐数为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; }

在这里插入图片描述

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

在我之前的这篇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; }

在这里插入图片描述
运行结果:

在这里插入图片描述

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

调试后观察内存:

在这里插入图片描述
可以看到,的确为小端存储模式。

写在最后

  • 能够熟练掌握联合体,说不定,在以后的某个时间就用上了呢。
  • 到这里,C语言自定义类型的介绍结束了,一共有三大块:结构体类型枚举类型联合体类型
  • 以下是我写的结构体和枚举的博客链接,欢迎阅读噢:
    结构体http://t.csdn.cn/IRpyh
    枚举http://t.csdn.cn/aeh10

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论