1 联合体
- 共用体
- 联合体内共用地址空间,即共享内存,从低地址覆盖
一次只能使用一个成员。
#include<stdio.h>
int main()
{
struct A//8个字节
{
char a;
int b;
};
union B//4个字节
{
char a;
int b;
};
return 0;
}
#include<stdio.h>
int main()
{
struct A//8个字节
{
char a;
int b;
};
union B//4个字节
{
char a;
int b;
}b;
struct A a;
a.a = 'x';
a.b = 10000;
printf("%c,%d\n", a.a, a.b);//x,10000
//union B b;
b.a = 'x';
b.b = 0x12345664;
printf("%c,%x\n", b.a, b.b);//d,12345664,ab共用地址空间,b覆盖a的数据,即64 56 34 12,64='d'
//char:1个字节8个位,一个十六进制数:4个位,'x'占用两个十六进制数字
return 0;
}
1.1 联合体应用——判断大小端
#include<stdio.h>
bool IsBig()//判断大端
{
short a = 1;//00000000 00000001
return *(char*)&a != 1;//大端存储以字节为单位:0 1
//定义一个(char*)指针指向a的地址,取一个字节,再对其解引用,如果!=1,说明为大端
}
bool IsLittle()//判断小端
{
union
{
char a;//char1个字节8位,0000 0001
short b;//00000000 00000001,小端存储以字节为单位:1 0
}u;
u.b = 1;
return u.a == 1;
}
int main()
{
printf("%d\n", IsBig());//0,PC是小端
printf("%d\n", IsLittle());//1
return 0;
}
2 位段
- 位域
- 在一个结构体中,以位为单位,来指定其成员所占内存长度。
位段成员必须是整型或枚举类型(通常是无符号unsigned类型);
如 int a : 20;其中后面的整数规定了成员占用的位数。 - 不能使用&对位段做取地址运算,不存在位段的指针。
联合体大小需能够整除最大成员所占字节数
struct M//12个字节
{
char a;//1+3
struct N
{
int b:20;//4
int c:20;//4
}n;
};
struct O//16个字节
{
int a;//4+4
union P//联合体,考虑单个最大字节,8个字节
{
long long b;//8
int c,d,e,f;//4
}p;
};
struct Q//36个字节
{
int a;//4
union R//32个字节
{
short b[4];//8
int c;//4
}r[4];
};
struct D//32位/8位=4个字节
{
int a : 5;//占5个位
int b : 9;
int c : 18;
//float f : 3;
//int n : 33;//int类型最大32位
};
struct E//5位,4个字节,字节数为4的倍数
{
int a : 2;
int b : 3;
};
struct F//25位,以4个字节对齐,8个字节,字节数为4的倍数
{
int a : 10;
int b : 20;
int c : 5;
};