结构体和联合体的区别

结构体:struct

        结构体中的每个成员都有自己的内存,其中每个成员的大小都是他自己的数据类型的实际内存

联合体:Union

        联合体结构和结构体都很相似,这里咱就不说了,这个联合体的经典之处在于,联合体他所有的成员公用一块内存

        先讲这里面的第一个问题他的这块公用内存有多大呢,拿个代码来算下

#include
using namespace std;

union MyUnion
{
	double id;
	char name;
	int age;
}a;

int main() {
	cout << sizeof(a) <

结构体和联合体的区别_第1张图片

 那么有了这个结果我觉得你应该就知道这个最大内存是多大了,他是里面所占内存最大的那个成员,就上面这个例子,他有double(8字节)、int(4字节)、char(1字节),所以这个联合体所占有的内存就是8字节

        那么第一个问题就解决了,下面咱们来讲另一个点,联合体的成员共用这一块内存,那么里面的成员到底是咋用的

        直接来讲:所有的成员公用这一块内存,当一个成员使用了这块内存,另一个成员要是也想再使用,那么就会覆盖掉前一个成员所使用的内存。并且每次都是从头开始的,画个图来简单说下

        结构体和联合体的区别_第2张图片

 

这时候最早输入的那个double类型的数据就没有了(这里本人存有一个疑问,如果每次都是刷新的话,那样是不是也挺浪费的,直接覆盖不就完事了,我怀疑这里可能是另一种机制,就是仅仅的及进行前四字节的覆盖,后面被破坏的数据还留着,但是当你最后使用之前的成员的话,系统默认的认为他是现在的int类型,只有4字节),其实他就是这样覆盖的,我下面的代码其实好像就是这种表面的情况,但是更深的我不太懂,下面来用代码表示下。

1、先验证最初始的,假设成员都是int类型,看下输出回是什么情况 

#include
using namespace std;

union MyUnion
{
	int id;
	int name;
	int age;
}a;

int main() {
	a.id = 123;
	a.name = 234;
	a.age = 4;

	cout << sizeof(a) <

结构体和联合体的区别_第3张图片看下结果,最后一个确实是把前面的覆盖了吧

2、如果数据类型不一样,开辟的内存是最大的那个内存,这个时候数据咋表示呢

        这个其实又分了两种情况,1是char类型的数据先使用了一个空间,接着又有了个int型的成员使用空间,那就会覆盖掉这个char,那么这时候,要是输出那个char成员该咋办呢?编码来看!

#include
using namespace std;

union MyUnion
{
	char id;
	int name;
	int age;
}a;

 int main() {
	a.id = 'v';
	a.name = 234;
	a.age = 456;

	cout << sizeof(a) <

结构体和联合体的区别_第4张图片

 

这个字符型的数据他消失了,很神奇,这个时候确实看不出来啥,那么咱们来调试下看看他是啥,这里我觉得他其实是是456这个数据int型的四字节中的第一个数据。

结构体和联合体的区别_第5张图片

结果显示的是这个,但是我不懂,大佬们看了自己懂吧 ,但是我坚信我的想法是对的。

        那么再来看第二个情况,int型的数据先使用空间,接着又有1个char型的数据要使用空间,那么这时候会是啥情况呢

#include
using namespace std;

union MyUnion
{
	int id;
	int name;
	char age;
}a;

 int main() {
	a.id = 123;
	a.name = 234;
	a.age = 'b';
	cout << sizeof(a) <

结构体和联合体的区别_第6张图片

这个结果我觉得不用太解释了,字符b的ASCII码的值是98

 以上为本人拙见。

你可能感兴趣的:(计算机系统基础,c算法,c++,其他)