C 语言-6 结构体&共用体

6.1 定义结构体

  • 在实际问题中,一组数据往往具有不同的数据类型。例如:在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构 (structure)”或叫“结构体”

  • “结构”是一种构造类型,由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型

  • 结构的定义

    • 一般定义形式:

      struct 结构名
      {成员表列};
      

      成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明

      • 成员表列定义形式:

        类型说明符 成员名;
        
    • 示例:

      struct stu
      {
          int num;
          char name[20];
          char sex;
          float score;
      };
      
  • 结构的说明

    1. 先定义,后说明

      //使用的上面那个示例,这里就不单独定义了
      struct stu boy1,boy2;
      

      说明了两个变量 boy1 和 boy2 为 stu 结构类型

      • 也可以用宏定义使一个符号常量来表示 一个结构类型

        #define STU struct stu
        STU
        {
            int num;
            char name[20];
            char sex;
            float score;
        };
        STU boy1,boy2;
        
    2. 在定义的同时进行说明

      • 一般形式:

        struct 结构名
        {
            成员表列
        }变量名表列;
        
      • 示例:

        struct stu
        {
            int num;
            char name[20];
            char sex;
            float score;
        }boy1,boy2;
        
    3. 直接说明

      • 一般形式:

        struct
        {
            成员表列;
        }变量名表列;
        

        与第二种方法的区别:第三种方法中省去了结构名,而直接给出结构变量

      • 示例:

        struct
        {
            int num;
            char name[20];
            char sex;
            float score;
        }boy1,boy2;
        
  • 上述三种说明方式都有相同的结构:
    image-20220812172328501

    • 在上述 stu 结构定义中, 成员也可以又是一个结构,构成了嵌套的结构,如:
      image-20220812174402546

      • 结构定义:

        struct date
        {
            int month;
            int day;
            int year;
        }
        struct
        {
            int num;
            char name[20];
            struct date  birthday;
            float score;
        }boy1,boy2;
        

        成员 birthday 被说明为 data 结构类型,成员名可与程序中其它变量同名,互不干扰

  • 结构变量成员的表示方法

    • 一般形式:

      结构变量名.成员名
      
    • 示例:

      boy1.num;
      boy2.sex;
      //如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用
      boy1.birthday.month
      
  • 结构变量的赋值

    • 示例:

      main()
      {
          struct stu
          {
              int num;
              char *name;
              char sex;
              float score;
          } boy1,boy2;
          boy1.num=102;
          boy1.name="Zhang ping";
          printf("input sex and score\n");
          scanf("%c %f",&boy1.sex,&boy1.score);
          boy2=boy1;
          printf("Number=%d\nName=%s\n",boy2.num,boy2.name);
          printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);
      }
      
  • 结构变量的初始化:在定义时进行初始化赋值

    • 示例:

      main()
      {
          struct stu /*定义结构*/
          {
              int num;
              char *name;
              char sex;
              float score;
          }boy2,boy1={102,"Zhang ping",'M',78.5};
          boy2=boy1;
          printf("Number=%d\nName=%s\n",boy2.num,boy2.name);
          printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);
      }
      

6.2 定义结构数组

  • 结构数组:每一个元素都是具有相同结构类型的下标结构变量

  • 用途:用结构数组来表示具有相同数据结构的一个群体

    • 如一个班的学生档案,一个车间职工的工资表
  • 定义方式与结构体类似,只需要将变量名表列写为数组即可

    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    }boy[5];
    

    定义了一个结构数组 boy,共有 5 个元素,boy[0]~boy[4]。每个数组元素都具有 struct stu 的结构形式

  • 初始化赋值

    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    }boy[5]={
        {101,"Li ping","M",45},
        {102,"Zhang ping","M",62.5},
        {103,"He fang","F",92.5},
        {104,"Cheng ling","F",87},
        {105,"Wang ming","M",58};
    }
    
    • 当对全部元素作初始化赋值时,也可不给出数组长度
  • 示例:

    #include"stdio.h"
    #define NUM 3
    struct mem
    {
        char name[20];
        char phone[10];
    };
    main()
    {
        struct mem man[NUM];
        int i;
        for(i=0;i<NUM;i++)
        {
            printf("input name:\n");
            gets(man[i].name);
            printf("input phone:\n");
            gets(man[i].phone);
        }
        printf("name\t\t\tphone\n\n");
        for(i=0;i<NUM;i++)
            printf("%s\t\t\t%s\n",man[i].name,man[i].phone);
    }
    

posted @   你是我的生命之源  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2021-08-22 Java 语言-1 Java 前期准备
2021-08-22 Java 语言-2 Java 基本语法 1.0
页脚
点击右上角即可分享
微信分享提示