C语言联合体基本内容
C语言联合体基本内容
一、联合体的声明与基本性质
与结构体声明语法基本相同,只是关键词为union,成员也可以是任意类型 联合体又叫共用体,顾名思义,联合体的变量共用同一块儿地址(简单理解,实际的内存地址分配有更精细的逻辑)
union un { char c; //共用体的两个成员,使用同一块儿地址,这里的c和i的地址相同,联合体的大小为4 int i; };
如果联合体的成员为同一种类型时,那么所有成员使用同一块儿地址
union mc { int i; char c; //这里如果创建char类型变量,那么后面所有的char都使用同一块儿地址,联合体的大小为4,不管增加多少个char类型都是一样的 char d; char e; char f; char g; char h; };
如果是数组,那么数组里面的相同类型的元素不会使用同一块儿地址,不过数组和另一种类型的成员使用同一块儿地址
union ic { int i; char c[5]; //这里创建了一个个数为5的数组,此时数组里面的每一项不共用同一块儿地址,数组里面的每一个char占用一块儿地址;同时,联合体的大小为最大对齐数的整数倍,这里,最大对齐数为int类型的大小,也就是4,所以,这个联合体的大小是8 };
二、联合体的妙用
由于联合体的成员使用同一块儿地址,所有我们可以通过联合体来巧妙的判断当前机器的存储方式是大端存储还是小端存储
#include <stdio.h> int save_type() //定义并实现一个函数,判断当前计算机是大端存储还是小端存储 { union un //定义一个联合体,成员变量为int型和char型 { int i; char c; }un; un.i = 1; //给成员变量i赋值为1 return un.c; //由于c和i共用一块儿地址,而i有4个字节,c只有1个字节,所以,如果是小端存储(0x01 00 00 00),c的值为1;如果是大端存储(0x00 00 00 01),c的值为0; } int main() { int ret = save_type(); if (ret) printf("小端"); else printf("大端"); return 0; }