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

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

一、

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;
}

联合体中变量的存放方式

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结构体共用体有一些相似之处,但也有一些重要的区别。 相同之处: - 结构体共用体都是用来组织不同类型的数据。 - 它们都可以包含多个成员变量。 - 成员变量可以是不同的数据类型。 不同之处: - 结构体的成员变量在内存中是按照顺序依次存储的,每个成员变量都占用独立的内存空间。而共用体的成员变量共享同一块内存空间,只能同时存储一个成员的值。 - 结构体的内存大小等于所有成员变量的大小之和,而共用体的内存大小等于最大成员变量的大小。 - 在使用结构体时,可以同时访问和修改多个成员变量的值。而在使用共用体时,只能访问和修改当前存储的成员变量的值。 - 结构体的成员变量可以同时存在多个实例中,每个实例都有独立的成员变量值。而共用体的成员变量只能在不同时间点存储一个成员的值,不同时间点存储不同成员的值会覆盖之前的值。 综上所述,结构体适用于组织多个不同类型的数据,并且每个实例都有独立的成员变量值。而共用体适用于在不同时间点存储不同类型的数据,并且不同成员的值会共享同一块内存空间。 #### 引用[.reference_title] - *1* [你真的了解结构体共用体吗?](https://blog.csdn.net/qq_61139806/article/details/124172529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [结构体共用体联合体)](https://blog.csdn.net/zhuguanlin121/article/details/118527438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值