C语言:关于联合体的学习

联合(共用体)

联合类型的定义联合也是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

联合体内的成员不是每一个都有独立的空间存在共用空间(合租);结构体每个成员有自己独立的空间;

比如:

union Un

{

int a;

char c;

};

//共用

struct st

{

int a;

char c;

};

int main()

{

union Un u;

struct st s;

printf("%d\n", sizeof(u));//4

printf("%d\n", sizeof(s));//5

printf("%p\n", &u);

printf( "%p\n", &(u.a));

printf("%p\n",&(u.c));

return 0;

}

打印三个关于联合体的地址可以发现的是三个地址都一样;说明a,c用的是同一块空间;

a用的时候c不能用,c用的时候a不能用;只需要做好这一点就行(类似于共享单车)

用完之后我换回去别人也能用;但是不能两个人同时扫到一辆车上;

改变a的值时,变相改掉了c的值;

int main()

{

union Un u;

u.a = 0x11223344;

u.c = 0x00;

}

一定程度上节省了空间;

联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

可以用联合体来判断编译器是大端存储还是小端存储;

通常:

#include<stdio.h>

int main()

{

int a=1;

char* p=(char*)&a;

printf("%d",*p);

}

如果*p=1就是小端存储(数据的低位置存放在内存的低地址);

如果*p=0就是小端存储(数据的低位置存放在内存的高地址);

联合体判断:

#include<stdio.h>

int main()

{

union

{

int a;

char c;

}u;//这里我们只需要定义一个联合体变量所以可以用匿名联合体;(与结构体类似)

u.a=1;

if(u.c==1)

{

printf("小端存储\n");

}

else if(u.c==0)

{

printf("大端存储\n");

}

}

联合体大小的计算

不是所有的联合体大小都是最大成员的大小;

结构体存在内存对齐,联合体也存在内存对齐;

联合体的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un

{

char arr[5];//5 字符数组形式存储时按照char类型对齐,对齐数是1;

int i;//4

};

/*联合体大小是最大对齐数的倍数;最大对齐数是4;联合体大小至少是最大成员的大小5;

所以4只能翻倍成8; 给变量开辟8个字节的空间但是它只是用了前5个后3个字节依然属于它只是没有使用*/

int main()

{

printf("%d \n", sizeof(union Un));// 8;

return 0;

}

union Un

{

short arr[7];//14

int i;//4

};

int main()

{

printf("%d\n", sizeof(union Un));// 16;

return 0;

}

最大对齐数*n直到至少可以装下最大成员;

自定义类型学习结束;

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值