结构体,枚举,联合

结构体

1. 结构体的创建

(1)在构建结构体之前,必须要对结构体进行声明。

     例:struct student      //描述一个学生,student为标签

{   char name[20];

    Int age;

    char sex[5];//内容不能为空

};  //此处的分号不能丢,此处也可写变量

(2)成员访问

2.1在(1)中的struct student{};相当于类型,比如int型,

Struct student   s  ;//s为变量

s中有name,age,sex,三个成员;

在访问成员是为(s.成员)的形式:例:s.age:访问的是age成员

  

2.2而如果需要访问指针指向的结构体变量时,应该解引用指针,这样就会获得指针指向的内容。

     例:p为指向结构体变量的指针

          Struct student *p=s;

(*p).name   (p->name)

  //访问成员,两种形式都可以

(3)初始化

  例:(1)struct student n1={“henry”,20,“男”};//先声明了结构体,然后赋值

     (2)Struct student{...}n2={“henry”,20,”男”};//在声明时就定义变量然后初始化。

2. 结构体的内存对齐

   在结构体中声明成员时,成员在内存中存放时要遵循内存对齐的原则:平台原因和性能原因。

   1struct s1

         {    char c1;// 第一个成员的地址偏移量为0,所以不需要

                     /对齐,占一个字节

              Int i;//第二个成员要考虑对齐,因为int 型占4个字节,而它要存放在自己对齐数的整数倍处,所以在第一个成员后空三个字节,这样才可以存放

              Char c2;//一共存放了8个字节,加上char9个,但是9不是最大对齐数4的整数倍,所以要添三个字节,结果为12个。

}

(2)struct s2

                {     char c1;//1,添3

                      Struct s1 s3;//s1中的最大对齐数为4,则它的对齐数为4,它的大小为12

                      Double d;//对齐数为8,16 8的整数倍,所以为2424又为最大对齐数8 的整数倍,所以结果为24

}

       总结:(1)对齐数:编译器默认的和该成员大小的较小值

               Visual环境为8Linux4

             2)总大小为成员中最大对齐数的整数倍。

             3)除了第一个,后一个成员之前的都为自己对齐数的整数倍。

             4)结构体的对齐数为成员中的最大对齐数。

3.结构体传参

  struct student {...}s;

       Int main()

       {  print (&s);//传地址,会提高性能

}

位段

  1.位段的声明和结构体相似。

   Struct k

{  int _a:2;//2个比特位,

  Int _b:5;//5个比特位,

  Int _c:10;//10 个比特位

          /前三个只用占用17个比特位,在32 位平台上还有15个空余

  Int _d:30;// 30个比特位,不够用,重新开辟一个,所以一共占

} ;          8个字节,两个整型

注意:成员必须是int ,unsigned int signed int char整型族

2.位段也需要注意内存对齐

 struct s

{

    char a : 3;//3个比特位

    char b : 4;//4个比特位,共7个,占一个字节

    char c : 5;//5个比特位,一个字节

    char d : 4;//4个比特位,一个字节

    Int e : 4;//前边共三个,补充一个,加上4,一共8个

};

枚举

enum day//枚举类型

{

Mon=1,

Tue=2,

Wed=3,

Sun=7,

}c1;

 Enum day c1=sun;//只能拿枚举常量赋值

不可以直接赋值 c1=7;

联合(共用体)

联合体的特点:至少要保存最大的成员

 union un

{

short c[7];//大小为7,对齐到4 的整数倍12 处

int i;//加上4,为16

};

                

猜你喜欢

转载自blog.csdn.net/ning_zhi_t/article/details/78609187