第十章 结构

结构体

  结构是一种构造类型的数据类型,是由数目固定、类型不同的若干变量的有序集合。

  在程序中使用结构体必须按两个步骤: (1)声明结构类型(2)定义结构体类型变量

一、基础语法概念

  1、声明结构体

    语法格式:

    struct  student         ----------->结构体类型名

    {       long int num ;

        char name[8] ,     ---------------.>结构体成员

        char sex ;

        float score[4];

    }

    结构体各成员的存储

                                

        遵循字节对齐原则:

          (1)结构体首地址到当前选取成员的字节数必须为当前选取成员字节数的倍数!

          (2)结构体分配的字节数应是最大类型成员字节数的倍数

          (3)可以指定字节对齐

    说明:(1)同一结构体重结构体成员不能同名

        (2)结构体类型的定义只是创建了新的数据类型,并不能保留内存空间,不能存放具体的数据。为了在程序中使用结构类型的数据,应在说明了结构体类型之后,再定义该结构类型的变量─结构变量,  以存放该结构类型的数据。

    2、结构体变量

      语法格式

        struct student

        { char name[8] ;

          char sex ;

          float score[2];

        } ;

        void main( )

        {

          struct  student  stu[n] ={0}; ----->定义结构体变量并初始化为0

           。。。          ----->使用结构体变量

        }    

                初始化要求与结构体成员一一对应赋初, 并且 初始数据类型与相应成员变量的类型一致。

 

         引用结构体变量: 结构体变量.结构体成员名

          说明:(1)必须逐个对成员进行输入输出操作

                (2)内嵌结构成员的引用,  应采取逐级访问的方法找到最底层的成员

                (3)结构变量的整体赋值

 

枚举

   将需要的变量值一一列举出来,便构成了一个枚举类型

   一基础概念

    1、语法格式:enum 枚举类型名 {变量值列表};

        例如: enum weekday {sun,mon,tue,wed,thu,fri,sat};

    2、作用:’列出了这种类型,通过这种类型定义的变量的取值范围只能在列出的枚举常量中取值。

      3、说明:各个枚举值就是符号常量,默认情况下,第一个符号常量就是0,第二个就是1...。
         enum  eRetType { NORMAL=5 , ZEROLEN , LESSZERO , NOBUILD , ERROR};
         如果第一个设置为5,那依次ZEROLEN 为6,接着,7 ,8

 

 

 

 

 联合体union

 

      当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。

       1)联合体是一个结构;

       2)它的所有成员相对于基地址的偏移量都为0;

       3)此结构空间要大到足够容纳最"宽"的成员;

       4)其对齐方式要适合其中所有的成员;

 

  说明:

 

     由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。

  示例       

    #include<stdio.h>
    union test
    {
    int a;
    char b;
    };
    int main()
    {
      union test str={0};
      int num=0x11223344;
      str.a=0x11223344;
      printf("%#x\t%#x",str.b,*(char*)(&num));
      return 0;
     }

 

posted @ 2020-03-10 21:00  直至成伤  阅读(178)  评论(0编辑  收藏  举报