联合union

2024-01-08 06:12:16

//————联合:union
1.联合的定义
联合也是一种特殊的自定义类型
#include<stdio.h>
union Un//Un为联合标签
{
?? ?int a;
?? ?char c;
};
struct St
{
?? ?int a;
?? ?int b;
};
int main()
{
?? ?union Un u;
?? ?printf("%d\n",sizeof(u));//4
?? ?printf("%p\n",&u);
?? ?printf("%p\n",&(u.a));
?? ?printf("%p\n",&(u.c));//三个打印地址的结果相同
?? ?return 0;
}
2.联合体的特点
联合体的成员是共用一块内存空间的,这样一个联合文件的大小,至少是最大成员的大小(因为至少要有能力保护最大的那个成员)
//union Un
//{
//?? ?int a;
//?? ?char c;
//};
//int main()
//{
//?? ?union Un u;
//?? ?u.a = 0x11223344;
//?? ?u.c = 0x00;//将c的地址改为0,也就等同于把最高位地址改为0,由于a和c共用一块1字节大小的地址,即c的改动也会同时影响a,即a的地址变为0x11223300
//?? ?return 0;
//}
——————通过枚举判断计算机大小端储存方式
//#include<stdio.h>
//int check_p()
//{
?? ?int a = 1;
?? ?return *(char*)&a;//&a为取出a的地址01 00 00 00,强制类型转换后为char,1字节,所以为01.返回此值,进行判断
?? ?//a的地址:
?? ?//低->高
?? ?//01 00 00 00——小端排序
?? ?//00 00 00 01——大端排序
?? ??? ?替换为
?? ?//union //Un//此类型创建在了函数内部(此类型只是为函数准备的,用一次之后就不再使用),因此联合标签Un可以省略,从而为:匿名联合(共用体)类型
?? ?//{
?? ?//?? ?char c;
?? ?//?? ?int i ;
?? ?//}u;
?? ?//u.i = 1;//此处i的地址为01 00 00 00(小端),而i与c同时占用第一字节大小的地址。所以c的地址就成了01
?? ?//return u.c;//返回1为小端,返回0为大端
//}
//int main()
//{
//?? ?int ret = check_p();
//?? ?if (ret == 1)
//?? ??? ?printf("小端\n");
//?? ?else
//?? ??? ?printf("大端\n");
//?? ?return 0;
//}
————3 .联合大小的计算
//联合的大小至少是最大成员的大小。
//当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
//#include<stdio.h>
//union Un1
//{
// char c[5];//5字节,对齐数1
// int i;//4字节,对齐数4
//};
//union Un2
//{
// short a[7];//14字节,对齐数2
// int b;
//};
//int main()
//{
//?? ?printf("%d\n", sizeof(union Un1));
//?? ?//Un1中,最大对齐数为4,最大成员大小为5,所以对齐到最大对齐数的整数倍,为8
//?? ?printf("%d\n", sizeof(union Un2));
//?? ?//Un2中,最大对齐数为4,最大成员大小为14,所以对齐到最大对齐数的整数倍,为16
//?? ?return 0;
//}

文章来源:https://blog.csdn.net/2201_75570527/article/details/135417802
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。