结构体,位段,枚举,联合

结构体

结构体类型的创建

结构体的格式:
struct 结构名
{成员列表}
变量名;
结构体创建时分为有名结构体和无名结构体。
有名结构体

struct str
{
     char name[20];
     int id;
     int age;
};
struct stu peopleinfo

无名结构体

struct
{
    char name[20];
    int id[8];
    int age;
}peopleinfo;

结构体的初始化

结构体的初始化就是确定一些变量的同时并且赋值
ep:

struct stu
{
    char name[20];
    char id[10];
    int age;
};
struct stu peopleinfo = {"zhangsan","2303030",20};
//这就是结构体的初始化

结构体的内存对齐

在这了我们要深入讨论一个问题:计算结构体的大小,这就关系到结构体的内存对齐问题。
结构体的对齐规则
1,第一个成员在与结构体变量的偏移量为0的地址处。
2,其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数=编译器默认的一个对齐数 与该成员大小的较小值。vs中的默认值为8,linux中的默认值为4.
3,结构体的总大小为最大对齐数(每个成员变量的都有一个对齐数)的整数倍。
4,如果有结构体嵌套的情况,嵌套的结构体对齐到自己的最大对齐数的 整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。
er:

struct s1
{
    char a1;
    int i;
    char a2;
};
printf("%d\n",sizeof(struct s1));

位段

位段的声明和结构体是类似的,但是有两处不同:
1,位段的成员必须是int,unsigned or signed int.
2,位段的成员后边有有一个冒号和一个数字。
ep:

struct a
{
      int b:2;
      int c:5;
      int d:10;
      int e:30:
};

这个结构体的大小的是7个字节

枚举

枚举的就是一一列举,把可能的值一一列举出来
ep:

enum sex
{
     male,
     female,
     secret,
}

枚举在没有特殊赋值时,maled的值为0,后面一次递增
接下来说一下枚举的优点
1,增强代码的可读性和可维护性
2,和define定义的标识符比较,枚举有类型检查,更严谨。
3,防止了命名污染。
4,便于调试
5,使用方便,一次可以定义多个变量。

联合

联合也是一种特殊的自定义类型,联合的成员是共用一块空间的,这样一个联合变量的大小,至少是最大成员的大小。

联合大小的计算:
1,联合的大小至少是最大成员的大小。
2,当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍处。
ep:

union un
{
    char c[3];
    int a;
};
union un1
{
     short c[8];
     int b;
};

猜你喜欢

转载自blog.csdn.net/aixintianshideshouhu/article/details/81738776