【C语言】自定义类型-联合体

前言

前面我们已经讲过了两种数据类型:数组、结构体,那么本文章我们来讲一下联合体

联合体是什么?

在C语言中,联合体(Union)是一种特殊的数据类型,它允许不同的数据类型共享同一块内存空间。联合体的定义和使用方式类似于结构体(Struct),但它们在内存布局和用途上有显著区别

一、联合体的定义

联合体的定义与结构体的定义是十分的相似的,我们可以这样子进行定义:

c 复制代码
union 数据类型名 {
    数据类型1 变量名1;
    数据类型2 变量名2;
    ...
    数据类型n 变量名n;
};

如下:

c 复制代码
union Un {
	int a;
	float i;
	char arr[20];
};

这里我们定义了一个联合体,里面有着int、float char\[\]的数据类型,同时对于联合体来说其数据类型名是可以省略的,如:

c 复制代码
union {
	int a;
	int i;
	char arr[20];
};

但是定义了匿名的联合体,我们希望使用typedef关键字对其进行命名,避免混淆


二、联合体的特点

  • 共享内存大小: 联合体的所有成员共享同一块内存空间。这意味着在任何时刻,联合体中只有一个成员的值是有效的,其他成员的值可能会被覆盖,我们看下面的代码:
c 复制代码
#include <stdio.h>

union Un {
	int i;
	char ch;

};

int main() {
	union Un n1;
	n1.i = 10;
	printf("%d\n", n1.i);

	n1.ch = 'a';
	printf("%d\n", n1.i);

	return 0;
}

结果如下:

这里我们发现,我们对i赋值后打印的i是正常的,但是我们再对ch赋值后,打印出来的i却是不一样的,说明了联合体是共存内存大小的,修改了其中的一个成员参数,其它成员也可能被改变

  • 内存大小: 联合体的大小至少等于其最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

这里我们int类型对齐数为4,char类型对齐数为1,最大的成员大小为4Byte,所以联合体大小为4Byte

这里我们的int类型对齐数为4Byte,char类型对其数为1Byte,但是最大的成员的char c5 大小为5Byte,因为联合体大小要与最大对齐数的整数倍,所以为8Byte


End

关于联合体的知识我们就讲到这里,小编的知识有限,希望本文章对您们有所帮助!谢谢大家的浏阅读!

相关推荐
天空'之城7 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
stevenseahang16 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·可移植性·标准演化·ansic
别动我齐刘海16 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
AI科技星17 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
坏柠20 小时前
C语言进阶:从零实现一个可靠的环形缓冲区,吃透回绕、边界与并发
java·c语言·算法
choumin21 小时前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数
LONGZETECH21 小时前
传统实训 vs 仿真实训:从技术架构拆解新能源汽车教学的范式之变
c语言·3d·unity·架构·汽车
白白白小纯21 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
Aurorar0rua21 小时前
CS50 x 2024 Notes Algorithms - 08
c语言·开发语言·算法·学习方法
✎ ﹏梦醒͜ღ҉繁华落℘1 天前
单片机基础知识--LVGL学习-lv_obj_add_flag()
c语言·单片机·学习