美文网首页
构造类型-联合类型

构造类型-联合类型

作者: 晓晓桑 | 来源:发表于2020-04-19 20:42 被阅读0次
    • 关键字 union
    • 声明的方式跟结构体一模一样。
    • 特别:所有的成员共享一块内存。(结构体是每一个成员都有一块内存)
    • 联合的大小是最大成员的大小
    • 修改一个成员,其他成员也会改变。
    union Un {
        char c;
        short s;
        int i;
    }un1,un2;
    
    int main(void) {
        return 0;
    }
    
    内存共享:
    image.png
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    union Un {
        char c;
        short s;
        int i;
    } un1, un2;
    
    struct stru {
        char c;
        short s;
        int i;
    } stru;
    
    int main(void) {
        //union Un的元素的起始地址是一样的,因为内存是共用的
        printf("%p,%p,%p\n", &un1.c, &un1.s, &un1.i);//0x10c5bf018,0x10c5bf018,0x10c5bf018
    
        //结构体的起始地址不一样哦,因为内存不共用
        printf("%p,%p,%p", &stru.c, &stru.s, &stru.i);//0x104302018,0x10430201a,0x10430201c
        return 0;
    }
    
    初始化
    union Un {
        int i;
        char c;
        short s;
    
    } un1, un2;
    int main(void) {
        //初始化部分,其他部分自动初始化成0
        //要初始化占位最大字节的成员
        //想初始化哪个成员,就把他放到最前面
      //union Un un3 = {21};跟下面的意思一样
        union Un un3 = {.i=3};
        un3.c = 97;
    
        return 0;
    }
    

    赋值

    union Un {
        int i;
        char c;
        short s;
    
    } un1, un2;
    
    int main(void) {
    
        //因为一个字节可以放的数字是-128~127,
        //21在-128~127之间,一个字节都能放得下
        union Un un3 = {21};
        printf("%d,%d,%d\n", un3.i, un3.c, un3.s);//21,21,21
    
        //解释看下图
        union Un un4 = {256};
        printf("%d,%d,%d", un4.i, un4.c, un4.s);//256,0,256
        return 0;
    }
    
    image.png
    大小

    不小于最大成员的字节。union不涉及到成员对齐,但是涉及到结尾补齐。

    union Un {
        int i;
        char c;
        short s;
    
    } un1, un2;
    
    int main(void) {
    
        //因为int 最大是4字节
        printf("%u,%u", sizeof(union Un), sizeof un1);//4,4
        return 0;
    }
    
    结尾补齐
    image.png
    union Un {
        int i;
        char c[5];
        short s;
    
    } un1, un2;
    
    int main(void) {
    
        //结尾补齐
        printf("%u,%u", sizeof(union Un), sizeof un1);//8,8
        return 0;
    }
    
    union Un {
        double d;
        char c[9];
        short s;
    
    } un1, un2;
    
    int main(void) {
    
        //结尾补齐
        printf("%u,%u", sizeof(union Un), sizeof un1);//16,16
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:构造类型-联合类型

          本文链接:https://www.haomeiwen.com/subject/qjlbbhtx.html