构造类型-联合类型
2020-04-19 本文已影响0人
晓晓桑
- 关键字 union
- 声明的方式跟结构体一模一样。
- 特别:所有的成员共享一块内存。(结构体是每一个成员都有一块内存)
- 联合的大小是最大成员的大小
- 修改一个成员,其他成员也会改变。
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.pngunion 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;
}