欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 08:50:05
...
/*
        联合体(共用体):一种数据结构;里面变量共用一个内存首地址,各种变量名可
以同时使用,操作同时生效
        和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;
}