C语言自定义类型之联合(union)

前面我们介绍了自定义类型的结构体和枚举,现在来介绍最后一种联合!


目录

1.联合类型的定义

2.联合的特点

3.联合体的大小

4.联合的使用


1.联合类型的定义

1.联合,又称共用体(union),它的使用方法和结构体类似,没有枚举那么简单

2.这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间

为什么说公用一块空间呢?我们看一下它们的地址就明白了:

#define _CRT_SECURE_NO_WARNINGS 1
#include

union UN
{
	char c;
	int i;
};
int main()
{
	union UN un;
	printf("%d\n", sizeof(un));
	printf("%p\n", &un);
	printf("%p\n", &un.c);
	printf("%p\n", &un.i);
	return 0;
}

C语言自定义类型之联合(union)_第1张图片

代码运行后我们发现这个联合的大小是4个字节,然后联合成员变量和联合名的地址是相同的,这就充分说明了它们公用一块空间,为什么大小是4个字节,我们在下面解释

2.联合的特点

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

C语言自定义类型之联合(union)_第2张图片

3.联合体的大小

1.联合的大小至少是最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍(可能存在,不是一定的)

我们可以验证一下这个对齐数:

typedef union Un1
{
	char c[5];//占5个字节
	int i;//占4个字节
}Un1;
typedef union Un2
{
	short c[7];//2*7是14个字节
	int i;//4个字节
}Un2;
int main()
{
	printf("%d   %d\n", sizeof(Un1), sizeof(Un2));
	return 0;
}

C语言自定义类型之联合(union)_第3张图片

我们可以分析,如果它们没有对齐的话,所占的内存Un1是5个字节,Un2是14个字节,但是结果是8个字节和16个字节,所以它们内存对齐了

4.联合的使用

我们应用联合来判断当前机器为大端还是小端

我们在什么是大端存储,什么是小端存储这篇博客中详细介绍了大端和小端,感兴趣的伙伴们可以去看看

大端:低位存在高地址,高位存在低地址

小端:低位存在低地址,高位存在高地址

我们这里介绍两种求法:

方法1:是平时我们用到的求法,和博客中提到的求法相同,这里就不进行过多说明

int main()
{
	int a = 1;
	if (*(char*)&a == 1)
	{
		printf("小端\n");
	}
	else
		printf("大端\n");
	return 0;
}

C语言自定义类型之联合(union)_第4张图片

方法2:使用联合

union UN
{
	char c;
	int i;
};
int main()
{
	union UN un;
	un.i = 1;
	if (un.c == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

C语言自定义类型之联合(union)_第5张图片

C语言自定义类型之联合(union)_第6张图片


联合体的知识就是这些,用到某些具体的实例中,大大方便了我们程序的设计,本期就到这里,我们下期再见!

你可能感兴趣的:(1024程序员节,c语言,visual,studio,开发语言)