共用体
在 C 语言中,允许几种不同类型的变量存放到同一段内存单元中,这种几个不同的变量共同占用一段内存的结构,被称为共用体类型结构,简称共用体。一般定义 形式为:
union 共用体名
{
数据类型 成员名 1;
数据类型 成员名 2;
…
};
只有先定义了共用体变量,才能在后续的程序中引用它。
不同于结构体的是,共用体变量的内存空间是连续的一大块,这几个变量共用这一块空间,所以要注意值被覆盖的问题。而结构体是在这连续的一大块空间中,给每个变量又划清了界限,各自拥有自己的空间,但是他们的起始地址都是连着的。不画图了用个表格看看
结构体
int 都是分开的 |
---|
char |
float |
double |
共用体
int 、char、long 、double都在这 |
---|
#include <stdio.h>
//结构体
struct TsetT{
int idata;
char cdata;
double ddata;
};
//联合体
union TsetU{
int idata;
char cdata;
int idata1;
double ddata;
};
int main(){
struct TsetT t1;
union TsetU u1;
//二者区别在于,结构体是在一片连续的内存空间分别存放int、char、double
//而联合体是在一块内存空间共享这些变量
printf("t1的内存大小是%d\n",sizeof(t1));//16
printf("u1的内存大小是%d\n",sizeof(u1));//8
//结果显而易见,联合体是记录最大的内存(double是8),而结构体是全部累加(整数倍)
//打印地址看看
printf("t1.idata:%p\n",&t1.idata);
printf("t1.cdata:%p\n",&t1.cdata);
printf("t1.ddata:%p\n",&t1.ddata);
puts("=========================");
printf("u1.idata:%p\n",&u1.idata);
printf("u1.cdata:%p\n",&u1.cdata);
printf("u1.ddata:%p\n",&u1.ddata);
/*
t1.idata:000000000061FE10
t1.cdata:000000000061FE14
t1.ddata:000000000061FE18
=========================
u1.idata:000000000061FE00
u1.cdata:000000000061FE00
u1.ddata:000000000061FE00
*/
t1.idata = 10;
t1.cdata = 'a';
t1.ddata = 9.9;
//打印地址看看
printf("t1.idata:%d\n",t1.idata);
printf("t1.cdata:%d\n",t1.cdata);
printf("t1.ddata:%.3lf\n",t1.ddata);
puts("=========================");
// u1.ddata = 9.9;
u1.idata = 10;
u1.cdata = 'a';
u1.idata1 = 50;
u1.ddata = 9.9;
printf("u1.idata:%d\n",u1.idata);
return 0;
}
共用体覆盖的问题在同类型中就是谁最后输入就是谁显示。比如int 一个30,int 一个50,最后打印结果肯定是显示50,因为都是int类型且50是最后输入。如果不是同种类型,比如int 和float,这个有点懵,先占个坑,评论有大神给解答下,不同类型可以参考下这里。