网站首页 > 文章精选 正文
1 联合的定义与使用
联合体(union),又称为共同体,它是C语言中的一个特性,它允许在相同的内存位置存储不同的数据类型,但每次只能存储其中一种类型的数据。这意味着联合体的所有成员都共享同一段内存空间。
联合体的语法格式:
union 联合体名称
{
类型1 变量名1;
类型2 变量名2;
...
类型N 变量名N;
};
注意,
- 共用体union是一个能在同一个存储空间存储不同类型数据的类型
- 共用体所占的内存长度等于其最长成员的长度,也有叫做共用体
- 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用
- 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖
- 共用体变量的地址和它的各成员的地址都是同一地址
代码示例:
#include <stdio.h>
// 共用体也叫联合体
union Test
{
unsigned char a;
unsigned int b;
unsigned short c;
};
int main()
{
// 定义共用体变量
union Test tmp;
// 1、所有成员的首地址是一样的
printf("%p, %p, %p\n", &(tmp.a), &(tmp.b), &(tmp.c));
// 2、共用体大小为最大成员类型的大小
printf("%llu\n", sizeof(union Test));
// 3、一个成员赋值,会影响另外的成员
tmp.b = 0x44332211;
printf("%x\n", tmp.a); // 11
printf("%x\n", tmp.c); // 2211
tmp.a = 0x00;
printf("short: %x\n", tmp.c); // 2200
printf("int: %x\n", tmp.b); // 44332200
return 0;
}
其中,Test的内存大小为4字节,变量b是联合体中内存占用最大的变量,因此,以它的内存为准。
2 联合体和结构体的区别
联合体和结构体是编程中两种用于数据组织和管理的结构,它们有着显著的区别:
- 内存使用:
- 结构体(struct)的每个成员都拥有各自独立的内存空间,这些空间是互不干涉且同时存在的。结构体的总长度等于其所有成员长度之和,并且遵循内存对齐原则。
- 联合体(union)的所有成员共享同一块内存空间。这意味着在任何时刻,联合体只能存储其成员中的一种类型的数据。尽管联合体可以包含多种类型的数据,但每次只有一个成员能使用这块内存。因此,联合体的总长度通常至少能容纳其成员中占用内存最大的数据类型的大小,且这个大小通常是所有成员类型大小的整数倍。
- 数据存储与访问:
- 在结构体中,所有成员的数据都是同时存在的,可以独立访问和修改每个成员的值,而不会影响到其他成员。
- 联合体则不同,由于其成员共享内存,对联合体中某个成员的赋值将会覆盖其他成员的数据。换句话说,联合体的所有成员都是对同一块内存的引用,修改一个成员的值将影响其他成员的值。
- 用途:
- 结构体通常用于将不同类型的数据组合成一个整体,形成一个自定义的数据类型,便于数据的组织和管理。
- 联合体则常用于需要节省内存空间的场景,或者需要动态地在多种类型之间切换的情况。例如,在处理底层硬件数据或进行网络通信时,可能会用到联合体。
---E N D---
喜欢的记得关注哦!
您的支持是我们前进的动力!
猜你喜欢
- 2025-01-05 PHP源码系列之扩展的原理与开发
- 2025-01-05 「linux」多个套接字可以绑定同一个端口吗
- 2025-01-05 基于netmap的用户态协议栈(一)
- 2025-01-05 Linux文件:超级块inode dentry file关系
- 2025-01-05 实战Netty!基于私有协议,怎样快速开发网络通信服务
- 2025-01-05 char, unsigned char,之间的相互转换
- 2025-01-05 PHP 扩展与 ZEND 引擎的整合
- 2025-01-05 C语言:位域和字节序
- 2025-01-05 Nor Flash的两种规范
- 2025-01-05 「技术干货」Ip头udp数据包ARP协议(代码实现netmap)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)