构造类型-联合类型

2020-04-19  本文已影响0人  晓晓桑
union Un {
    char c;
    short s;
    int i;
}un1,un2;

int main(void) {
    return 0;
}
内存共享:
image.png
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
union Un {
    char c;
    short s;
    int i;
} un1, un2;

struct stru {
    char c;
    short s;
    int i;
} stru;

int main(void) {
    //union Un的元素的起始地址是一样的,因为内存是共用的
    printf("%p,%p,%p\n", &un1.c, &un1.s, &un1.i);//0x10c5bf018,0x10c5bf018,0x10c5bf018

    //结构体的起始地址不一样哦,因为内存不共用
    printf("%p,%p,%p", &stru.c, &stru.s, &stru.i);//0x104302018,0x10430201a,0x10430201c
    return 0;
}
初始化
union Un {
    int i;
    char c;
    short s;

} un1, un2;
int main(void) {
    //初始化部分,其他部分自动初始化成0
    //要初始化占位最大字节的成员
    //想初始化哪个成员,就把他放到最前面
  //union Un un3 = {21};跟下面的意思一样
    union Un un3 = {.i=3};
    un3.c = 97;

    return 0;
}

赋值

union Un {
    int i;
    char c;
    short s;

} un1, un2;

int main(void) {

    //因为一个字节可以放的数字是-128~127,
    //21在-128~127之间,一个字节都能放得下
    union Un un3 = {21};
    printf("%d,%d,%d\n", un3.i, un3.c, un3.s);//21,21,21

    //解释看下图
    union Un un4 = {256};
    printf("%d,%d,%d", un4.i, un4.c, un4.s);//256,0,256
    return 0;
}
image.png
大小

不小于最大成员的字节。union不涉及到成员对齐,但是涉及到结尾补齐。

union Un {
    int i;
    char c;
    short s;

} un1, un2;

int main(void) {

    //因为int 最大是4字节
    printf("%u,%u", sizeof(union Un), sizeof un1);//4,4
    return 0;
}
结尾补齐
image.png
union Un {
    int i;
    char c[5];
    short s;

} un1, un2;

int main(void) {

    //结尾补齐
    printf("%u,%u", sizeof(union Un), sizeof un1);//8,8
    return 0;
}
union Un {
    double d;
    char c[9];
    short s;

} un1, un2;

int main(void) {

    //结尾补齐
    printf("%u,%u", sizeof(union Un), sizeof un1);//16,16
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读