随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


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

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

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

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


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;
}


posted on   万一  阅读(2227)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2007-11-28 刷新网页
2007-11-28 把字符串复制到剪贴板
2007-11-28 如果一个对象不存在


点击右上角即可分享
微信分享提示