🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 联合体(共用体) * 长度等于联合体中定义的变量当中最长的那个 * 联合体只能保存一个变量的值 * 联合体共用同一块内存,在嵌入式设备中起到节省内存的目的 #### 零基础学通C语言摘要 #### 共用体 共用体也是用户自定义的数据类型,不过该类想中的所有成员共用一块内存,因此一个成员变量赋值,就等于所有成员都被赋予了相同的值 代码 ``` #include<stdio.h> #include<string.h> union book { char name[10]; char price[10]; };//定义一个共用体,有2个成员,name和price,这2个成员共用一块内存,因此他们的地址相同 int main() { union book mybook; strcpy(mybook.name,"呼啸山庄"); strcpy(mybook.price,"11元8角"); printf("name的地址 :%p\n",&mybook.name); printf("price的地址:%p\n",&mybook.price);//输出结果显示它们的地址相同 printf("书名:%s\t",mybook.name); printf("价格:%s\n",mybook.price);//由于price1被赋值时,覆盖了name1成员的值,因此他们的值也是一样的 return 0; } ``` 输出结果 ~~~ name的地址 :0x7ffde4ac2a46 price的地址:0x7ffde4ac2a46 书名:11元8角 价格:11元8角 ~~~ **共用体的大小** ``` #include<stdio.h> union book { int num; char name[9]; double price; char sell; }; int main() { union book mybook; int size=sizeof(mybook); printf("共用体mybook的大小为:%d",size); return 0; } ``` 输出结果 ~~~ 共用体mybook的大小为:16 ~~~ > **共用体mybook的大小应该是最长的那个成员的大小,即name成员的大小,但是name的大小为9,输出结果却是16,和是因为共用体的成员也要对齐,而最大成员所占的字节数必须是其他成员的整数倍,假如不够则补齐,16既是double型成员的整数倍,也是num成员的整数倍,还是char型成员的整数倍,因此name按16补齐** **共用体变量不能被初始化** 共用体中的所有成员共用一块内存,因此无法对所有成员进行初始化 **共用体类型可以在结构体类型中定义** ``` #include<stdio.h> #include<string.h> struct goods { char name[20]; float price; union //在结构体类型goods中定义一个共用体变量number { int num; float quantity; }number; }; int main() { struct goods drug; strcpy(drug.name,"安定"); drug.price=1.20f; drug.number.quantity=0.1f;//为number的成员quantity赋值 printf("售出商品名:%s 单瓶价格:%.2f 销售数量:%.2f瓶", drug.name,drug.price,drug.number.quantity); return 0; } ``` 输出结果 ~~~ 售出商品名:安定 单瓶价格:1.20 销售数量:0.10瓶 ~~~