C语言从零开始——union联合体
程序员文章站
2022-07-15 08:50:05
...
/*
联合体(共用体):一种数据结构;里面变量共用一个内存首地址,各种变量名可
以同时使用,操作同时生效
和struct区别:
1,结构体中所有变量都是共存的,有一个成员变量,就开辟一个变量类型的内存>空间;这种数据结构内存空间分配是粗放的,不管用不用,都会分配
2,联合体中各个变量不共存,所有变量共用一个内存首地址(开辟原则,选成员>变量中变量类型最大的);这种数据结构,节省内存,使用精细灵活
*/
联合体(共用体):一种数据结构;里面变量共用一个内存首地址,各种变量名可
以同时使用,操作同时生效
和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;
}
上一篇: C语言学习-函数篇
下一篇: C语言中的 联合体 union 说明