C语言联合体

一、联合体的概念

联合 (union) 是一个能在同一个存储空间里 ( 但不同时) 存储不同类型数据的复合数据类型。
大致结构如下:
n union foo /* 定义一个联合类型foo */
n {
q int digit;
q double bigfl[10];
q char letter;
n }baz; /* 定义一个example类型的联合变量baz */

二、联合体大小计算规则

 联合体大小要至少能容纳最大的成员变量
 联合体大小要是所有成员变量类型最大值的整数倍 (注意是类型而不是变量)

因为联合体的存储是在同一个空间里的,所以在存储数据时,它会以里面所占字节数最大的那个数据类型的整数倍来作为整个联合体所占字节数的大小,如,在上面的代码中,联合体里面最大的数据类型是double,所以整个联合体所占字节数是8的整数倍,分析如下图:

在如上联合体中,该联合体共占80个字节。 因为digit是int型变量,占4个字节,而double  bigf[10]占80个字节,char占1个字节,所以联合体最小需>=80,而double又是里面最大的数据类型,所以该联合体的大小需为8的整数倍,故该联合体占80个字节,如图:

再如:

union U
{
    char s[9];
    int n;
    double d;
};

 该联合体中,char s[9]占1个字节,int n占4个字节,double d占8个字节,首先联合体所占字节数需满足>=9,而因为double是里面最大的数据类型,故该联合体的大小需为double的整数倍,在9和8中,16刚好满足即大余9又是8的整数倍,故所占字节数为16。

所占内存如图:

三、联合体的初始化

 联合体的初始化和结构体的类似,如图:

#include <stdio.h>
union IP
{
	unsigned char str[4];
	unsigned int digit;
};
int main()
{
	union IP ip;
	printf("Please enter IP address in string format:\n");
	scanf("%d.%d.%d.%d",&ip.str[0],&ip.str[1],&ip.str[2],&ip.str[3]);
	printf("IP address in digital format is: %u\n",ip.digit);
	return 0;
}

但是也有要注意的:

#include <stdio.h>

union test{
	int a;
	char b;
	long c;
}u1;

union s{
	int d;
	char e;
}u4;

int main(void)
{
	//不允许对联合体所有成员进行初始化
//	union test u2 = {1,'c',32};
	union test u2 = {1};
	//如果指定元素初始化,则后面指定的会将前面指定的进行覆盖
	union test u3 = {.b = 'c',.a=65};

	printf("a = %d\n",u2.a);
	printf("b = %d\n",u2.b);
	printf("c = %ld\n",u2.c);
	printf("a = %d\n",u3.a);
	printf("b = %d\n",u3.b);
	printf("c = %ld\n",u3.c);


	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钜锋王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值