共用体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;
};
相关推荐
佳児素花痴╮1 小时前
树的基础知识与查找排序算法
数据结构·算法
lueluelue478 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16811 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子11 小时前
Adaboost算法原理与计算实例
算法
别怪我很水11 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚14 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机14 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*15 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木15 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode