大话C语言:第37篇 联合体

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)的所有成员共享同一块内存空间。这意味着在任何时刻,联合体只能存储其成员中的一种类型的数据。尽管联合体可以包含多种类型的数据,但每次只有一个成员能使用这块内存。因此,联合体的总长度通常至少能容纳其成员中占用内存最大的数据类型的大小,且这个大小通常是所有成员类型大小的整数倍。

  • 数据存储与访问:

    • 在结构体中,所有成员的数据都是同时存在的,可以独立访问和修改每个成员的值,而不会影响到其他成员。

    • 联合体则不同,由于其成员共享内存,对联合体中某个成员的赋值将会覆盖其他成员的数据。换句话说,联合体的所有成员都是对同一块内存的引用,修改一个成员的值将影响其他成员的值。

  • 用途:

    • 结构体通常用于将不同类型的数据组合成一个整体,形成一个自定义的数据类型,便于数据的组织和管理。

    • 联合体则常用于需要节省内存空间的场景,或者需要动态地在多种类型之间切换的情况。例如,在处理底层硬件数据或进行网络通信时,可能会用到联合体。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值