C语言从零开始——union联合体

时间:2022-06-01 21:12:50
/*
        联合体(共用体):一种数据结构;里面变量共用一个内存首地址,各种变量名可
以同时使用,操作同时生效
        和struct区别:
        1,结构体中所有变量都是共存的,有一个成员变量,就开辟一个变量类型的内存>空间;这种数据结构内存空间分配是粗放的,不管用不用,都会分配
        2,联合体中各个变量不共存,所有变量共用一个内存首地址(开辟原则,选成员>变量中变量类型最大的);这种数据结构,节省内存,使用精细灵活
*/

演示代码:union_1.c

#include <stdio.h>union un //定义联合体结构,里面有三个成员变量,int数据类型最大,所以当定义该结构体变量时,内存开辟四个字节空间大小
{
int a;
char b;
float c;
}d; //定义该结构体变量d,d为全局变量

int main(void)
{
printf("sizeof(d) = %d \n",sizeof(d));  //测试输出sizeof(d) 为4
union un u; //实例化联合体结构变量u
u.a = 12;  //初始化成员a
printf("u.a = %d \n",u.a);
printf("u.b = %d \n",u.b);
printf("u.c = %f \n",u.c);

printf("u.a address = %p \n",&u.a);
printf("u.b address = %p \n",&u.b);
printf("u.c address = %p \n",&u.c);
        return 0;
}
/*
sizeof(d) = 4
u.a = 12 //只定义了u.a 但是u.b也是12,说明只开辟了一个空间,成员共同使用
u.b = 12
u.c = 0.000000 //之所以不是12,因为float和int不能简单的忽略类型表示,两个数据类
型在表达时有冲突

u.a address = 0x7fff846eee50
u.b address = 0x7fff846eee50
u.c address = 0x7fff846eee50 //三个成员变量地址是一样的,以内整个联合体只开辟了4个字节空间供所有成员使用
*/
####   内存存储大端小端问题   ####

/*
        内存中数据是如何存放?大端还是小端,运用联合体可以进行测试
        0x12345678
        address:
        small_endian: 12 34 56 78 //所有操作系统都是小端存储
        big_endian:   78 56 34 12 //网络传输都是大端模式
*/
演示代码:union_2.c

#include <stdio.h>union un{        int a;        char b;        float c;};int main(){        union un u;        u.a = 130;        printf("u.a = %d \n",u.a);        printf("u.b = %d \n",u.b);/*        如果是小端存储:u.a = 0000 0000 0000 0001                        u.b =                0001        如果是大端存储:u.a = 0001 0000 0000 0000                        u.b =                0000*/        return 0;}