【C语言】共用体

共用体定义

共用体结构体类似的地方

// 结构体
struct Boy {
    int id;
    char name[20];
    double age;
};

// 共用体
union boy {
    int id;
    char name[20];
    double age;
};

// 共用体 可以不需要名称
union {
    int id;
    char name[20];
    double age;
} boy, a;

共用体初始化

初始化只能给其中一个元素赋值

// 定义时初始化
union Boy {
    int id;
    char name[20];
    double age;
} boy = {
        .name = "大数据男孩",
};

// 直接初始化 第一个成员
union Boy boy = {1}; 

// 用另一个共用体初始化
union Boy b = boy;  

// 初始化指定成员
union Boy o = {.name = "大数据男孩"};

共用体里元素的地址

共用体里面元素共用一个地址

#include <stdio.h>
#include <string.h> // 共用体、结构体 在初始化之后赋值,需要用到该库函数
// 共用体
union Boy {
    int id;
    char name[20];
    double age;
};

int main(void){
    union Boy boy;

    boy.id = 1;
    strcpy(boy.name,"大数据男孩"); // 不管是 结构体、共用体,只有在初始化时才能直接对字符串赋值。
    boy.age = 18.5;

    // 打印地址
    printf("boy.id: %p\n", &boy.id);
    printf("boy.name: %p\n",boy.name);
    printf("boy.age: %p\n", &boy.age);

    return 0;
}

mark

共用体里元素的值

因为共用体里元素的地址是一样的,所以只能输出最后赋值元素

#include <stdio.h>
#include <string.h> // 共用体、结构体 在初始化之后赋值,需要用到该库函数
// 公用体
union Boy {
    int id;
    char name[20];
    double age;
};

int main(void){
    union Boy boy;
    // 赋值
    boy.id = 1;
    strcpy(boy.name,"大数据男孩"); // 不管是 结构体、共用体,只有在初始化时才能直接对字符串赋值。
    boy.age = 18.55;
    // 打印共用体的值
    printf("boy.id: %d\n", boy.id);
    printf("boy.name: %s\n",boy.name);
    printf("boy.age: %.2f\n", boy.age);

    return 0;
}

mark

共用体的内存占用

这里内存占用,涉及到与 结构体一样的 内存对齐

#include <stdio.h>
#include <string.h> // 共用体、结构体 在初始化之后赋值,需要用到该库函数
// 公用体
union Boy {
    int id;
    char name[20];
    double age;
};

int main(void){
    union Boy boy;
    // 赋值
    boy.id = 1;
    strcpy(boy.name,"大数据男孩"); // 不管是 结构体、共用体,只有在初始化时才能直接对字符串赋值。
    boy.age = 18.55;
    // 打印共用体元素的内存占用
    printf("boy.id sizeof : %llu\n", sizeof(boy.id));
    printf("boy.name sizeof : %llu\n",sizeof(boy.name));
    printf("boy.age sizeof: %llu\n", sizeof(boy.age));
    // 打印共用体的内存占用
    printf("boy sizeof: %llu\n", sizeof(boy));
    return 0;
}

mark

发表评论 / Comment

用心评论~