联合体也叫共同体,共用体,从外表看联合体与结构体长得很相似,结构体每个成员都有本身独立的内存空间,可是联合体则共用同一片内存空间,也就是联合体同时只能容许一个变量存在。
特色:
1.联合体的内部是以堆叠的形式存在的;
2.整个联合体的尺寸取决于,成员中尺寸最大的那个成员;
3.给联合体成员赋值的时候只有最后一个是有效数据 (其余数据被践踏);
4.联合体的成员之间是互相排斥的,在某一时刻只有一个成员有效。ui
union 联合体的标签 { 成员1 ; 成员2 ; 成员3 ; ...... .... };
语法:
联合体的标签:用来区分不一样的联合体
成 员:是指包含在联合体内的各个成员,能够是任意类型指针
typedef union my_union{ int a; double b; char c; }my_uin, *p_my_uin; int main(int argc, char const *argv[]){ my_uin my_union1; int size = sizeof(my_uin); printf("%d\n" , size); return 0; }
联合体的操做与结构体没有差异,可是因为联合体的内存特性, 在赋值/初始化的时候,只有最后一个/第一个数据是有效数据。code
//普通初始化只有第一个成员是有效的 my_uin my_union1 = {100, 0.01, 'a'}; printf("my_union1.a:%d\t my_union1.b:%lf\t my_union1.c:%c\n", my_union1.a, my_union1.b, my_union1.c); 输出:my_union1.a:100 my_union1.b:0.000000 my_union1.c:d //注意:my_union1.c输出的'd'是无效值,正确的值应该是'a'
//指定成员初始化只有最后一个成员是有效的 my_uin my_union2 = { .a = 100, .b = 0.02, .c = 'b' }; printf("my_union2.a:%d\t my_union2.b:%lf\t my_union2.c:%c\n", my_union2.a, my_union2.b, my_union2.c); 输出:my_union2.a:98 my_union2.b:0.000000 my_union2.c:b //注意:my_union2.a是无效值
my_uin my_union3; my_union3.a = 100; printf("my_union3.a: %d\t my_union3.b: %f\t my_union3.c:%c \n", my_union3.a, my_union3.b, my_union3.c); my_union3.b = 0.03; printf("my_union3.a: %d\t my_union3.b: %f\t my_union3.c:%c \n", my_union3.a, my_union3.b, my_union3.c); my_union3.c = 'c'; printf("my_union3.a: %d\t my_union3.b: %f\t my_union3.c:%c \n", my_union3.a, my_union3.b, my_union3.c); 输出: my_union3.a:100 my_union3.b: 0.000000 my_union3.c:d my_union3.a:-343597384 my_union3.b: 0.030000 my_union3.c: my_union3.a:-343597469 my_union3.b: 0.030000 my_union3.c:c
注意:
联合体的成员之间是互相排斥的,在某一时刻只有一个成员有效,即便输出的值是正确的。内存
//共同体指针指定成员初始化只有最后一个指定的是有效的 p_my_uin p_my_union1 = NULL; p_my_union1 = (p_my_uin)calloc(1, sizeof(my_uin)); //注意,共同体指针须要给它指向一个空间,这个'空间的类型'是my_uin p_my_union1->a = 100; p_my_union1->b = 0.001; p_my_union1->c = 'c'; printf("p_my_union1->a:%d\t p_my_union1->b:%lf\t p_my_union1->c:%c\n" ,p_my_union1->a, p_my_union1->b, p_my_union1->c); free(p_my_union1); p_my_union1 = NULL; 输出:p_my_union1->a:-755914397 p_my_union1->b:0.001000 p_my_union1->c:c //最后一个值才是有效
联合体不多单独去使用,通常会与结构体一块儿使用, 用来表达某个互斥的属性.io
typedef struct my_struct{ int a; float b; char c; my_uin my_union4; //注意my_uin,在上面的程序中已经声明了 }my_str, *p_my_str; int main(int argc, char const *argv[]){ my_str my_struct1 ; my_struct1.my_union4.f = 345.123; printf("my_struct1.my_union4.f: %lf\n",my_struct1.my_union4.f); return 0; } 输出:my_struct1.my_union4.f: 345.123
枚举类型本质上是一个受限制的整型数据,好比咱们用0-6 表示6个命令,0-3来表示4个状态......变量
enum { 枚举常量1, 枚举常量2, 枚举常量3, .... };
注意:
1.枚举常量本质上是整型,首个枚举常量默认是0;
2.枚举常量在没有赋值的状况下,是前一个枚举常量的值+1;
3.枚举常量能够接受赋值;
4.枚举常量支持全部整形的操做。语法