• 学点 C 语言(28): 数据类型 联合(union)



    在结构中, 每个字段的数据类型是唯一的; 使用联合可以在一个字段中储存不同的数据类型.

    不同的数据类型共享一块内存. 当然其内存大小应依着大的来.

    联合中的数据, 非此即彼, 只有一个有效; 应该有说明在某个数据中此时有用的是什么类型.

    除了共享内存以外, 联合与结构一样.


    1. union 的大小是其中最大数据成员的大小:
    #include <stdio.h>
    
    int main(void)
    {
        union MyUnion {
            short  n1;
            int    n2;
            double n3;
        };
        
        printf("%u, %u\n", sizeof(union MyUnion), sizeof(double));
    
        getchar();
        return 0;
    }
    

    2. union 的特点是共享内存, 修改一个其他都会变:
    #include <stdio.h>
    #include <limits.h>
    
    int main(void)
    {
        union MyUnion {
            unsigned char     n1;
            unsigned short    n2;
            unsigned int      n3; 
        } U = {0};
    
        printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);
    
        U.n2 = USHRT_MAX;
        printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);
    
        U.n3 = INT_MAX;
        printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);
    
        U.n1 = 0;
        printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);
    
        getchar();
        return 0;
    }
    

    3. 在结构中使用联合:
    #include <stdio.h>
    
    int main(void)
    {
        enum UnionTyte{SHORT, INT, FLOAT};
        
        struct Rec {
            unsigned ID;
            enum UnionTyte type; /* 识别字段 */
            union {              /* 联合 */
                short s;
                int   i;
                float f;
            } u;
        } R[4];
    
        size_t i;
        
        R[0].ID = 1;
        R[0].type = SHORT;
        R[0].u.s = 123;
    
        R[1].ID = 2;
        R[1].type = INT;
        R[1].u.i = 12345;
    
        R[2].ID = 3;
        R[2].type = FLOAT;
        R[2].u.f = 3.14;
    
        R[3].ID = 4;
        R[3].type = INT;
        R[3].u.i = 54321;
        
        for (i = 0; i < sizeof R / sizeof R[0]; i++) {
            switch (R[i].type) {
                case SHORT : printf("%u: %hd\n", R[i].ID, R[i].u.s); break;
                case INT   : printf("%u: %d\n", R[i].ID, R[i].u.i);  break;
                case FLOAT : printf("%u: %g\n", R[i].ID, R[i].u.f);  break;
            }   
        }
        
        getchar();
        return 0;
    }
    

  • 相关阅读:
    改变oracle数据库归档模式_译文
    改变数据库归档模式
    oracle状态
    oracle开启一个用户
    plsql中文乱码问题方案解决
    mybatis 和hibernate的区别
    jquery
    servlet 相应头重定向
    自定义鼠标右键
    关于select input(选中,取值,赋值等)--------方便自己查阅
  • 原文地址:https://www.cnblogs.com/del/p/1343485.html
Copyright © 2020-2023  润新知