联合(联合体,共用体)详解

联合是C语言中的另一种高级数据结构,在编写程序过程中合理的使用共用体,可以节省内存空间,还可以简化多种复杂数据的处理!!

关键字:union

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


其中,联合的定义形式如下:

union  employee //联合体名
{
	char name[];//成员列表
	int age;
	char sex;
};

与结构体不同,联合的所有成员共享同一块内存,而结构体的每个成员都有自己的内存空间,一个联合类型的字节长度为:占用内存空间最多的成员变量的字节长度

下面笔者来带领大家测试一下:联合的所有成员共享同一块内存是否成立??

请看笔者代码:

#include <stdio.h>

union un
{
	char c;
	int i;
	double d;
};

int main()
{
	union un un1;
	printf("&un1   :%p\n", &un1);
	printf("un1.c  :%p\n", &(un1.c));
	printf("un1.i  :%p\n", &(un1.i));
	printf("un1.d  :%p\n", &(un1.d));

	return 0;

}

显而易见,代码的运行结果为:

 上面的各个地址都是一样的,说明:联合的所有成员共享同一块内存是成立的!!!

根据联合的最后地址 是一样的这个结果:我们也可以知道:联合体中的成员,不可能同时有,即:在某些时间点上,只有存在1个!!

对于:一个数值,在存储的时候,需要的内存空间只要超过1个字节,就涉及顺序问题:

对于int num=0x11223344;这个在联合体的内存中如何存储??我们来进一步做下探讨:

笔者在之前的文章曾经讲过大小端字节序存储!想要欣赏的各位老铁,可以进行观看一下!!

文章名称为:理解整型在内存中的存储

原文链接为:理解整型在内存中的存储_念君思宁的博客-CSDN博客

 大端字节序存储:低位放在高地址,高位放在低地址!!

 小端字节序存储:地位放在低地址,高位放在高地址!!

 在之前的博客中,笔者就有过涉及:VS中是按照小端字节序存储??还是按照大端字节序存储的博客!!在此,笔者用多种方法来给大家演示一下:

1.

#include <stdio.h>

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

上述代码中:&num——》int * 类型,强制类型转化为(char *)类型!

代码的运行结果为:

int num=1;  //0x00000001

大端字节序存储情况:

 小端字节序存储情况:

将上面第一个字节,取出那个地方的地址,强制类型转化为(char *)类型的指针!!在后面对其解引用的时候,访问一个字节!!

其实上面的代码,在调试中,能够更好的观察出来情况!!在此,笔者就不再带领大家进行更多的演示了!

2.


#include <stdio.h>

int check_sys()
{
	int num = 1;
	char* p = (char*)&num;
	if (*p == 1)
		return 1;
	else
		return 0;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

3


#include <stdio.h>

int check_sys()
{
	union un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

上面的三种代码,都是判断大小端的正确代码!!

在联合体的那种写法中:

u.i = 1;    u.c;  共用同一块起始地址!!

 这次,笔者的大致内容已经讲解完毕,若有其他需要,请欣赏笔者的下一篇关于联合体大小计算的博客,或者私聊笔者,都可以哟!!

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/127305856