• C语言:关键字---union(声明共用体类型)


    C语言32个关键字
    有32个关键字详细说明,还有跳转链接!


    一、union 简介

    union 是C语言中一种声明共用体的数据类型。
    union(共用体)在某种程度上类似struct(结构体)的一种数据结构,可以包含很多数据结构和变量。
    union(共用体)的特点:其内部的数据 共用一个内存首地址共享同一段内存,以达到节省空间的目的。

    二、union 定义

    1. 声明共用体类型

    一般形式具体如下:

    union 共用体名
    {
       //成员列表
       数据类型 成员名;
       数据类型 成员名;
       ....
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    举例说明如下:

    union _MQ
    {
    	char data8[4];
    	int  data32;
    }; 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 定义共用体变量

    一般形式具体如下:

    union _MQ
    {
    	char data8[4];
    	int  data32;
    }; 
    //定义共用体变量
    union _MQ mq;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    合并简化形式具体如下:

    union _MQ
    {
    	char data8[4];
    	int  data32;
    }mq;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    匿名结构体形式具体如下:

    union 
    {
    	char data8[4];
    	int  data32;
    }mq;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 使用 typedef 声明共用体类型,再定义共用体变量

    一般形式如下:

    typedef union MQ
    {
    	char data8[4];
    	int  data32;
    } _MQ;
    //定义共用体变量,以下两种效果一样
    union MQ mq;
    _MQ mq;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    匿名共用体形式具体如下:

    typedef union 
    {
    	char data8[4];
    	int  data32;
    } _MQ;
    //定义共用体变量
    _MQ mq;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    三、union 使用方法

    共用体变量成员----赋值(.)

    初始化定义时----赋值

    typedef union 
    {
    	char data8[4];
    	int  data32;
    }_MQ; 
    
    _MQ mq =
    {
    	.data32=0x12345678 
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    初始化后----赋值

    mq.data32=0x12345678;
    
    • 1

    union(共用体)----共用内存

    #include <stdio.h>
    
    typedef union 
    {
      char data8[4];
      int  data32;
    }_MQ; 
    
    _MQ mq =
    {
      .data32=0x12345678 
    };
    
    int main(int argc, char *argv[])
    {
    	printf("data[0]=0x%x\n",mq.data8[0]);
    	printf("data[1]=0x%x\n",mq.data8[1]);
    	printf("data[2]=0x%x\n",mq.data8[2]);
    	printf("data[3]=0x%x\n",mq.data8[3]);
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

    四、union 占用的内存空间

    union(共用体) 占用的内存空间,是由其中占用内存最大的成员变量决定的。

    #include <stdio.h>
    
    typedef union 
    {
    	char data1;
    	int  data2;
    	float data3;
    	double data4; 
    }_MQ; 
    _MQ mq;
    
    int main(int argc, char *argv[])
    {
    	printf("data1占用的%d字节\n",sizeof(mq.data1));
    	printf("data2占用的%d字节\n",sizeof(mq.data2));
    	printf("data3占用的%d字节\n",sizeof(mq.data3));
    	printf("data4占用的%d字节\n",sizeof(mq.data4));
        printf("共用体占用的%d字节\n",sizeof(mq));
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    五、位结构和共用体联合使用

    具体程序如下:

    #include <stdio.h>
    
    typedef union 
    {
    	int  data;
    	struct 
    	{
    		int a:1;//第0位
    		int b:2;//第1,2位
    		int c:3;//第3,4,5位
    		int d:4;//第6,7,8,9位
    		int e:6;//第10,11,12,13,14,15位
    	}bit;
    }_MQ; 
    
    _MQ mq=
    {
       .bit.a = 1,
       .bit.b = 3,
       .bit.c = 6,
       .bit.d = 10,
       .bit.e = 26
    };
    
    int main(int argc, char *argv[])
    {
    	printf("data=0x%x\n",mq.data);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行结果如下:
    在这里插入图片描述
    解释说明:

    变量15 14 13 12 11 109 8 7 65 4 32 10
    a(1)1
    b(3)11 (3)
    c(6)110 (6)
    d(10)1010 (10)
    e(26)011010 (26)

    结果是0b0110101010110111=0x6ab7


    C语言:位结构体

  • 相关阅读:
    晶振与定时时间的简单理解
    Binlog 中添加 seqnum 和 parent 两个字段
    Openstack 通信
    让我看看你们公司的代码规范都是啥样的?
    云安全之身份认证与授权机制介绍
    百度超级链开放网络治理监督藏品火爆售罄!
    2022CCPC网络预选赛题解
    [C++]使用纯opencv去部署yolov9的onnx模型
    一文读懂区块链隐私技术系列之环签名
    java命令中的options
  • 原文地址:https://blog.csdn.net/MQ0522/article/details/125227434