C语言学习之:union联合

  • union联合是一个能在同一个存储空间存储不同类型数据的类型。
  • 联合体所占的内存长度等于其长度最长成员的长度。
  • 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用。
  • 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖。
  • 共用体变量的地址和它的各成员的地址都是同一地址。
union var
{
    
    
	double a;
	float b;
	int c;
	short d;
	char f;
}var;
int main()
{
    
    
	printf("%d\n",sizeof(var));
}
/*
	结果是8;符合联合体所占的内存长度等于其长度最长成员的长度
*/
union var
{
    
    
	double a;
	float b;
	int c;
	short d;
	char arr[12];
}var;
int main()
{
    
    
	printf("%d\n",sizeof(var));
}

/*
	结果是16;涉及内存对齐
	最长的数据类型是double,占8个字节,arr占了12个字节,但是要和double对齐,占用内存是8的倍数,也就是16.
*/

union和struct的异同:
相同点:都可以包含很多种数据类型和变量。
不同点:

  • 结构体:struct内存分配是不管你用不用都会给你全分配。
  • 联合体:节省内存
    举个例子
#include <iostream>

using namespace std;


union vars
{
    
    
	double a;   //8
	float b;    //4
	int c;      //4
	short d;    //2
	char f[12]; //12
}var;


struct stus
{
    
    
    double a;    //8
	float b;     //4
	int c;       //4
	short d;     //2
	char f[12];  //12
}stu;

int main()
{
    
    
    printf("%d\n",sizeof(var)); //结果是16
    printf("%d\n",sizeof(stu)); //结果是32
    return 0;
}

上张图便于理解
在这里插入图片描述
对于union来说先找共用体中占用字节最大的数据类型,是double占8个字节,再找占用空间最大的成员是arr,占用12 字节,占用空间要是8的倍数,结果就是16.
在这里插入图片描述
对于struct来说,分配内存大小大于等于数据成员所占内存之和。找出结构体中数据成员占用字节最大的是double占8个字节,结构体所占内存之和为30,内存补齐为8的倍数,最终为32。

ps:至于对齐系数,每个特定平台上的编译器都有自己的默认“对齐系数”,也可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
先留着坑,回头再写一篇详谈。

猜你喜欢

转载自blog.csdn.net/Yang_1998/article/details/106480231
今日推荐