C_基础_第八章 结构

结构体

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

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

一、基础语法概念

  1、声明结构体

    语法格式:

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

    {       long int num ;

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

        char sex ;

        float score[4];

    }

    结构体各成员的存储

                                

        遵循字节对齐原则:

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

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

          (3)可以指定字节对齐

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

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

2、结构体变量的初始化

    • #include <stdio.h>
      
      struct Books
      {
         char  title[50];
         char  author[50];
         char  subject[100];
         int   book_id;
      } book = {"C 语言", "RUNOOB", "编程语言", 123456};
      
      int main()
      {
          printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
      }

3、结构作为函数参数

    • #include <stdio.h>
      #include <string.h>
       
      struct Books
      {
         char  title[50];
         char  author[50];
         char  subject[100];
         int   book_id;
      };
      
      /* 函数声明 */
      void printBook( struct Books book );
      int main( )
      {
         struct Books Book1;        /* 声明 Book1,类型为 Books */
         struct Books Book2;        /* 声明 Book2,类型为 Books */
       
         /* Book1 详述 */
         strcpy( Book1.title, "C Programming");
         strcpy( Book1.author, "Nuha Ali"); 
         strcpy( Book1.subject, "C Programming Tutorial");
         Book1.book_id = 6495407;
      
         /* Book2 详述 */
         strcpy( Book2.title, "Telecom Billing");
         strcpy( Book2.author, "Zara Ali");
         strcpy( Book2.subject, "Telecom Billing Tutorial");
         Book2.book_id = 6495700;
       
         /* 输出 Book1 信息 */
         printBook( Book1 );
      
         /* 输出 Book2 信息 */
         printBook( Book2 );
      
         return 0;
      }
      void printBook( struct Books book )
      {
         printf( "Book title : %s\n", book.title);
         printf( "Book author : %s\n", book.author);
         printf( "Book subject : %s\n", book.subject);
         printf( "Book book_id : %d\n", book.book_id);
      }

4、指向结构的指针

    • #include <stdio.h>
      #include <string.h>
       
      struct Books
      {
         char  title[50];
         char  author[50];
         char  subject[100];
         int   book_id;
      };
      
      /* 函数声明 */
      void printBook( struct Books *book );
      int main( )
      {
         struct Books Book1;        /* 声明 Book1,类型为 Books */
         struct Books Book2;        /* 声明 Book2,类型为 Books */
       
         /* Book1 详述 */
         strcpy( Book1.title, "C Programming");
         strcpy( Book1.author, "Nuha Ali"); 
         strcpy( Book1.subject, "C Programming Tutorial");
         Book1.book_id = 6495407;
      
         /* Book2 详述 */
         strcpy( Book2.title, "Telecom Billing");
         strcpy( Book2.author, "Zara Ali");
         strcpy( Book2.subject, "Telecom Billing Tutorial");
         Book2.book_id = 6495700;
       
         /* 通过传 Book1 的地址来输出 Book1 信息 */
         printBook( &Book1 );
      
         /* 通过传 Book2 的地址来输出 Book2 信息 */
         printBook( &Book2 );
      
         return 0;
      }
      void printBook( struct Books *book )
      {
         printf( "Book title : %s\n", book->title);
         printf( "Book author : %s\n", book->author);
         printf( "Book subject : %s\n", book->subject);
         printf( "Book book_id : %d\n", book->book_id);
      }

 

5、结构体大小计算

 

    • C 语言中,我们可以使用 sizeof 运算符来计算结构体的大小,sizeof 返回的是给定类型或变量的字节大小。

      对于结构体,sizeof 将返回结构体的总字节数,包括所有成员变量的大小以及可能的填充字节。

      以下实例演示了如何计算结构体的大小:

    • #include <stdio.h>
      
      struct Person {
          char name[20];
          int age;
          float height;
      };
      
      int main() {
          struct Person person;
          printf("结构体 Person 大小为: %zu 字节\n", sizeof(person));
          return 0;
      }

      以上实例中,我们定义了一个名为 Person 的结构体,它包含了一个字符数组 name、一个整数 age 和一个浮点数 height

      在 main 函数中,我们声明了一个 Person 类型的变量 person,然后使用 sizeof 运算符来获取 person 结构体的大小。

      最后,我们使用 printf 函数打印出结构体的大小,输出结果如下:

      结构体 Person 大小为: 28 字节

 

枚举

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

   一基础概念

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

       

 

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