联合(共用体)
联合类型的定义
代码解释如下
struct enum
union Un //联合体定义联合体类型的时候的关键字。un是自定义的
{
char c;//1 这放联合体或共用体成员
int i;//4
};
int main()
{
union Un u //用上面的类型在这里创建的变量
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));//打印出这三个地址是一样的
//printf("%d\n", sizeof(u));//占用内存空间4个字节.为什么是4 因为i c共用了一块空间
return 0;
}
联合的特点
代码解释同上
struct enum
union Un //联合体定义联合体类型的时候的关键字。un是自定义的
{
char c;//1 这放联合体或共用体成员
int i;//4
};
int main()
{
union Un u = {10};//联合体初始化 是共同初始化 两个都变10
u.i = 1000;//单独初始化 这个相当于4个字节存1000个元素
u.c = 100;// 相当于第一个放100个元素
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));//打印出这三个地址是一样的
//printf("%d\n", sizeof(u));//占用内存空间4个字节.为什么是4 因为i c共用了一块空间
return 0;
}//联合体是在多个成员想让他们共同享有其中某一块空间的时候就用联合体
判断当前计算机大小端
如果是1则表示小端;如果是0,则是大端。
int main()//判断当前机器大小端
{
int a = 1;
if ((*(char*)&a) == 1)//&a其实就是起始位置的地址 他是整型变量int*所以强制类型转换 在解引用拿到一个字节
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
int check_sys()
{
int a = 1;
if ((*(char*)&a) == 1)
{
return 1;//小端
}
else
{
return 0;//大端
}
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
联合体实现方法如下
int check_sys()
{
union U
{
char c;
int i; //给i放值相当于c也覆盖了
}u;
u.i = 1;//相当于给内存里放了个1 至于是大端还是小端看返回值
return u.c;
//返回1 就是小端
//返回0 就是大端
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
联合大小的计算
union Un
{
short s[5];// 2 10
int a;//4
}; //结果12
union Un
{
char a[5];//1 按1看 占5个字节 5不是4倍数所以要对齐到最大对齐数整数倍,4的倍数所以是8
int i;//4
char c;//1 两个char是5 两个对齐数是1 最大对齐数1 a站5个字节是最大对齐数倍数
};
int main()
{
union Un u;
printf("%d\n", sizeof(u)); // 4 5打印8个字节,联合体存在对齐
return 0;
}