C语言之结构体枚举联合的理解

一、结构体

        结构体的定义:结构体是C语言中一种可以自定义的数据类型。结构体就像名字一样,是一些结构的集合。结构是一些值的联合,结构的每个成员可以是不同类型的变量。

结构体的声明:

        有名字的结构体,创建一个学生结构体:

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

    struct Stu
    {
      char name[20];
      int age;
      char sex[5];
    };
匿名结构体:
struct
{
  int x;
  int y;
  char a;
}arr;

匿名结构体的variable-list声明的变量不能省略。

结构体的访问:

如上面创建的学生结构体s可以通过s.age,s.name,s.sex来访问结构体的成员或使用结构体指针来访问结构体如

s->age,s->name,s->sex两者是一样的。

结构体的初始化:

上面的学生s结构体初始化

s={"zhangsan",20,"nan"};

二、枚举

枚举就如字面意思一一列举,现实中有许多事情是可以一一列举出来的,枚举变量应运而生。枚举是常量,在定义厚不可以再次进行赋值。

枚举的定义:

enum SEX
{
  male,//0
  female,//1
  secret//2
};

枚举中的值也可以自定义:

enum SEX
{
  male,//0
  female=4,//4
  secret//5
};

三、联合

联合也是一种特殊的自定义类型,联合变量也包含一系列成员,但这些成员是共用同一块空间的,所以叫做联合。

联合的声名:

union
{
  char c;
  int i;
};

联合的特点就是数据共用一块空间,现在我没来讨论一下这几种自定义数据类型的空间大小。

在这之前我们需要知道为什么要内存对齐:

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

内存对齐的规则:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
Win32平台下的微软C编译器(cl.exefor 80×86)的对齐策略:
1)结构体变量的首地址是其最长基本类型成员的整数倍;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能是该基本数据类型的整倍的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
在了解这些之后我们可以很容易算出这几种自定义数据类型的大小了:
    struct Stu
    {
      char name[20];
      int age;
      char sex[5];
    }s;

通过内存对齐规则我们可以算出这个结构体大小为32字节。

union
{
  char c;
  int i;
};

这个联合体的大小为4字节。

位段:

struct s
{
char a : 2;
char b : 5;
char c : 2;
}

所以是两个字节。














猜你喜欢

转载自blog.csdn.net/CHR_1s/article/details/80298989
今日推荐