zoukankan      html  css  js  c++  java
  • C语言联合体的使用

    1、联合体简介

    在C语言编程中,变量的定义是分配存储空间的过程,一般情况下,每个变量都具有自己的存储空间,但是,使用联合体可以实现在同一个内存空间中存储不同的数据类型,任一时刻存储一种数据类型,不是同时存储。

    在C语言中,定义联合体的关键字为union,定义一个联合体类型的一般形式如下:

    union 联合名
    {
      成员表
    };

    成员表中可以包含若干成员,成员的一般形式为:类型说明符 成员名,联合体类型占用的字节数与成员中最大数据类型占用的字节数一致。

    结构体和联合体的区别在于,结构体的各个成员会占用不同的内存,互相之间没有影响,而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

    2、联合体变量定义

    创建联合体和创建结构体的方式类似,需要一个联合体模板和联合体变量,以下是定义联合体变量的方式:

    (2.1)先创建模板,再定义变量

    //创建联合体模板union data
    union data {
      int a;
      char b;
      double c;
    };
    
    //使用联合体模板定义变量a,b,c
    union data a, b, c;

    在上面的代码中,data是联合体名,由编程人员决定,创建了联合体模板之后,就可以使用该类型去定义变量,在变量定义的时候需要加上union关键字。

    (2.2)同时创建模板和变量

    //创建联合体模板的同时定义变量
    union data {
      int a;
      char b;
      double c;
    } a, b;

    在上面的代码中,创建联合体模板union data的同时定义了两个变量a、b。

    (2.3)省略联合体名

    //省略联合体名
    union data {
      int a;
      char b;
      double c;
    } a, b;

    (2.4)使用typedef定义

    //联合体模板union data重命名为data_u类型
    typedef union data {
      int a;
      char b;
      double c;
    } data_u;
    
    //使用data_u类型去创建变量
    data_u a, b;

    在上述代码中,使用了typedef重新命名联合体模板名。

    3、联合体初始化

    联合体的初始化与结构体不一样,联合体只能存储一个值,有三种初始化方式:

    data_u a;
    a.a = 10;
    
    //将一个联合体初始化为同类型的联合体
    data_u b = a;
    
    //初始化联合体的第一个成员
    data_u c = {20};
    
    //指定初始化某个成员
    data_u d = {.a = 30};

    4、实例

    (4.1)定义联合体变量并输出其成员值

    新创建hello.c文件,并输入下面内容:

    #include <stdio.h>
    
    typedef union data {
        int a;
        char b;
        double c;
    } data_u;
    
    int main(int argc, char *argv[])
    {
        data_u a = {.a = 100};
        
        printf("a.a = %d
    ", a.a);
        
        return 0;
    }

    编译程序并执行,输出效果如下:

    (4.2)检测处理器大小端模式

    使用联合体来进行判断大小端模式,代码如下所示:

    #include <stdio.h>
    
    typedef union data {
        int a;
        char b;
    } data_u;
    
    int main(int argc, char *argv[])
    {
        int size = sizeof(data_u);
        data_u a = {.a = 0x12345678};
        
        printf("sizeof(data_u) =  %d
    ", size);
        
        if (a.b == 0x78)
            printf("little endian
    ");
        else
            printf("big endian
    ");
        
        return 0;
    }

    联合体的用法还很多,可以自行查资料了解。

  • 相关阅读:
    容易遗忘的配置
    linux中启动Zookeeper
    Linux中设置静态ip地址
    IDEA中工程上传到SVN
    Invalid bound statement(not found):cn.e3mall.mapper.TbItemMapper.selectByExample.....
    获取不到jdbc.driver的值解决办法
    idea中applicationContext-trans.xml中的Cannot resolve bean 'dataSource'...的问题解决
    idea中applicationContext-dao.xml文件中Cannot resolve file***** :spring xml model validation问题
    如何在IDEA中导入一个普通的java工程
    Navicate for mysql如何导入一个sql文件
  • 原文地址:https://www.cnblogs.com/Cqlismy/p/14599941.html
Copyright © 2011-2022 走看看