共用体union

一、共用体的特性

共用体又叫做联合体,共用体的特性如下:

1.共用体的所有成员共用一段内存空间,且所有成员的起始位置是一致的

2.共用体的值由最后赋值的成员决定

3.共用体的内存大小

  • 共用体的内存必须大于或等于 其他成员变量中最大数据类型(含数组)的大小。
  • 共用体的内存必须是最宽**++基本数据类型++** 的整数倍,如果不是,则填充字节。

二、共用体的用途1(判断大小端)

cpp 复制代码
#include <stdio.h>
union myunion {
    int a;
    char b;
};
int main()
{
    union myunion test;
    test.a = 0x12345678;        
    if (test.b == 0x78)
        printf("小端模式");
    else if (test.b == 0x12)
        printf("大端模式");    
     return 0;
}

三、共用体的用途2(给GPIO赋值)

cpp 复制代码
/* 用途2: 给成员集体赋值*/
#include <stdio.h>

struct GPIO{
	unsigned short Pin0 :1;
	unsigned short Pin1 :1;
	unsigned short Pin2 :1;
	unsigned short Pin3 :1;
	unsigned short Pin4 :1;
	unsigned short Pin5 :1;
	unsigned short Pin6 :1;
	unsigned short Pin7 :1;
	unsigned short Pin8 :1;
	unsigned short Pin9 :1;
	unsigned short Pin10 :1;
	unsigned short Pin11 :1;
	unsigned short Pin12 :1;
	unsigned short Pin13 :1;
	unsigned short Pin14 :1;
	unsigned short Pin15 :1;
};

union IODevice{
	unsigned short gpiovalue;
	struct GPIO gpiox;
};

int main()
{
	union IODevice IO;
	IO.gpiovalue=0xff;
	printf("%d\n",IO.gpiox.Pin0);
}

四、共用体的用途3

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define TOTAL 4  //人员总数

struct{
    char name[20];
    int num;
    char sex;
    char profession;
    union{
        float score;
        char course[20];
    } sc;
} bodys[TOTAL];

int main(){
    int i;
    //输入人员信息
    for(i=0; i<TOTAL; i++){
        printf("Input info: ");
        scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));
        if(bodys[i].profession == 's'){  //如果是学生
            scanf("%f", &bodys[i].sc.score);
        }else{  //如果是老师
            scanf("%s", bodys[i].sc.course);
        }
        fflush(stdin);
    }

    //输出人员信息
    printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");
    for(i=0; i<TOTAL; i++){
        if(bodys[i].profession == 's'){  //如果是学生
            printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);
        }else{  //如果是老师
            printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);
        }
    }
    return 0;
}

五、共用体的用途4(类型转换)

cpp 复制代码
union Converter {
    int i;
    float f;
};

// 使用共用体进行类型转换
union Converter conv;
conv.f = 3.14;
int intValue = conv.i;

六、共用体的用途5(处理特定硬件寄存器)

cpp 复制代码
union Register {
    unsigned int reg;
    struct {
        unsigned int bit0: 1;
        unsigned int bit1: 1;
        unsigned int bit2: 1;
        unsigned int bit3: 1;
        unsigned int reserved: 28;
    } bits;
};
相关推荐
郝学胜-神的一滴3 分钟前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
LDG_AGI7 分钟前
【搜索引擎】Elasticsearch(六):向量搜索深度解析:从参数原理到混合查询实战
人工智能·深度学习·算法·elasticsearch·机器学习·搜索引擎
会编程的土豆8 分钟前
【数据结构与算法】二叉树深度
算法·深度优先
knight_9___17 分钟前
RAG面试篇9
java·人工智能·python·算法·agent·rag
贾斯汀玛尔斯20 分钟前
每天学一个算法--Top-K 查询(Top-K Retrieval)
算法
菜鸟丁小真40 分钟前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
贾斯汀玛尔斯1 小时前
每天学一个算法--PageRank
算法
子琦啊1 小时前
【算法复习】滑动窗口(同向区间指针)
算法
啊我不会诶1 小时前
【自用复习】牛客每日一题2026.4.18 最大稳定数值
算法·深度优先
笨笨饿1 小时前
66_C语言与微控制器底层开发
linux·c语言·网络·数据结构·算法·机器人·个人开发