结构体、位段、枚举、联合体(共用体)之间的关系和区别

一、

1.结构体的定义模式:

struct stu
{ 
  char name[20];
  int age;
  int tele;
  char sex[5];
}s;

2.结构体所占内存空间大小
结构体在内存中的存储是根据内存对齐原则存储的,具体方法参照文章(C语言中如何计算结构体的字节大小)。

3.结构体的特点
结构体是用来定义不同种类型变量的一个集合,结构体中可以是不同种类的变量类型。

二、

1.位段的定义模式:

struct stu
{
    int a : 15;
    int b : 17;
    int c : 9;
}s;

2.位段所占内存空间大小
位段在内存中存储时不考虑内存对齐原则,位段存在的意义就是为了节省空间,如果当一个变量在使用中不需要其所能表示的数的最大范围时,可以根据实际需求定义位的大小。位段中存储的一般都是整型家族的变量,若定义的是int型,原本占用了32位,但是实际只需要15位就可以表示,那么就如同定义模式中进行定义。定义位段时开辟空间一般按存储的变量进行开辟,若存放的是int型变量,那么一次就开辟4个字节大小,如果不够则继续开辟4字节,若存放char型变量,则每次开辟1个字节的内存。

3.位段的特点
位段的定义模式和结构体相类似,但却有些不同,位段中的变量应该是同种类型的,而且是整型家族的。位段的存在是为了节省内存空间,每个变量的大小因其程序所需进行定义。

三、

1.枚举的定义模式:

enum color
{
   RED,   //0
   GREEN, //1
   BLUE,  //2
};
enum color c=RED;
printf("%d.\n",c);   //0

2.枚举所占内存空间大小
枚举类型内包含一些将会用到的名称,一般在使用switch语句时,将case()中的数字换成枚举类型中的名称会比较容易理解,枚举类型在定义之后,编译器会自动的将第一个量绑定为0,以此类推,后面的量将会是1、2…,当然这里也可以在定义时给名称一个整型的值,比如GREEN=9;那么BLUE将会自动绑定为10。由于枚举类型中的名称与整型的值绑定,所以枚举类型中的每个名称所占的内存空间均为int型所占的内存空间大小,为4。

3.枚举类型的特点
枚举类型主要是为了能在编写代码时,应用到switch语句中,加强代码的可读性。具体的好处还要在今后的编写代码中慢慢感受。

四、

1.联合体(共用体)的定义模式:

union stu
{
  char a;
  int b;
  char c[9];
};

2.联合体(共用体)所占内存空间大小
联合体之所以又称为共用体,是因为联合体中的变量所占的空间是共用的,也就是在定义一个char型变量和int型变量时,int型变量占用4个字节,而char型变量将会占用int型变量4个字节中的第一个字节,他们的地址都是相同的。联合体所占内存空间的大小至少为其内部最大变量的大小,或大于最大变量的大小,实际的大小将是内部对齐数最大的变量的对齐数的整数倍。特别注意这里如果定义了一个数组变量,比如char c[9];,它的对齐数应为char型变量的对齐数,为1,而不是数组大小。然后与编译器默认对齐数(VS中对齐数=8)相比较,取最小值就为该变量的对齐数。如上的联合体中对齐数最大的变量即为int b;(对齐数为4),而联合体中最大变量的大小即为数组变量char c[9];的大小,为9,所以实际联合体的大小为4*3=12。(12>9)

3.联合体(共用体)的特点
联合体的存在是在特定需求时会用到,比如在计算某机器的存放方式为小端模式或大端模式时,就可以用到联合体来判断,代码如下:

int check_sys(void)
{
union un
{
  char a;
  int b;
};
union un u;
u.b=0x44332211;
if(u.a==17)    //00010001
{
  return 1;
}
else
{
   return 0;
}
}
int main()
{
   int ret;
   ret=check_sys();
   if(ret==1)
   {
   printf("小端模式");
   }
   else
   {
   printf("大端模式");
   }
   return 0;
}

位构云平台 位构性的关系_位构云平台

通过联合体的使用就会很方便的得到结果。