C语言——结构体(超详解)

[复制链接]
发表于 2025-12-6 15:24:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
 
一.先容
二.结构体在C语言中的界说
struct Date birth = {12, 28, 1987};
界说结构体数组:
例子:
指向结构体变量的指针:
例子:
指向结构体数组的指针:
例子:
用结构体变量和结构体变量的指针作函数参数
将一个结构体变量的值转达给另一个函数,有3个方法。
往期回顾:

 
一.先容


        列出的每个数据项自己就是一个实体,称为数据字段
        全部数据字段合在一起形成一个称为纪录的单位
        在C语言中,纪录被称为结构。
结构的情势由符号名称、数据范例和纪录中各个数据字段的分列构成。
该结构的内容由存储在符号名中的现实数据构成。

二.结构体在C语言中的界说

   struct
{
 int month;
  int day;
  int year;
} birth;
为结构中列出的各个数据项保存存储空间。末了反面分号前面是变量。
这三个数据项是结构的成员。结构体的成员可以通过:•birth.month, birth.day, birth.year;这种情势举行访问。
代码如下:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     struct
  5.     {
  6.         int month;
  7.         int day;
  8.         int year;
  9.     } birth;
  10.     birth.month = 12;
  11.     birth.day = 28;
  12.     birth.year = 1987;
  13.     printf("My birth date is %d/%d/%d\n", birth.month, birth.day, birth.year % 100);
  14.     return 0;
  15. }
复制代码
        通常列出结构的情势,没有反面的变量名结构成员列表的前面必须有效户选择的结构范例名称。
        好比:
  1. struct Date
  2. {
  3.   int month;
  4.   int day;
  5.   int year;
  6. };
复制代码
界说语句如下:struct Date birth 。struct Date的作用相称于int等
  1. #include <stdio.h>
  2. struct Date
  3. {
  4.     int month;
  5.     int day;
  6.     int year;
  7. };
  8. int main()
  9. {
  10.     struct Date birth;
  11.     birth.month = 12;
  12.     birth.day = 28;
  13.     birth.year = 1987;
  14.     printf("My birth date is %d/%d/%d\n", birth.month, birth.day, birth.year % 100);
  15.     return 0;
  16. }
复制代码
结构体的初始化依照与数组初始化雷同的规则:
struct Date birth = {12, 28, 1987};

结构成员可以是任何数据范例
好比:
  1. struct PayRecord
  2. {
  3.   char name[20];
  4.   int idNum;
  5.   double regRate;
  6.   double otRate;
  7. };
  8. struct PayRecord employee = {"H. Price", 12387, 15.89, 25.50};
复制代码
结构的长处是同一结构范例在列表中多次利用,单个成员可以是数组和结构体。  
  1. struct
  2. {
  3.   char name[20];
  4.   struct Date birth;
  5. } person;
  6. Example: person.name[4]
  7.                        person.birth.month
复制代码
综上我们可以用如下代码加深一下明白:  
  1. #include <stdio.h>
  2. #define NUMRECS 5
  3. struct PayRecord {  // construct a global structure type
  4.     int id;
  5.     char name[20];
  6.     double rate;
  7. };
  8. int main() {
  9.     int i;
  10.     struct PayRecord employee[NUMRECS] = {
  11.         {32479, "Abrams, B.", 6.72},
  12.         {33623, "Bohm, P.", 7.54},
  13.         {34145, "Donaldson, S.", 5.56},
  14.         {35987, "Ernst, T.", 5.43},
  15.         {36203, "Gwodz, K.", 8.72}
  16.     };
  17.     for (i = 0; i < NUMRECS; i++) {
  18.         printf("%d %-20s $%.2f\n",
  19.                employee[i].id, employee[i].name, employee[i].rate);
  20.     }
  21.     return 0;
  22. }
复制代码
  假如没有显式初始化,静态数组和外部数组或结构的数值元素都初始化为0(或null)。    界说结构体数组:

  •分析:
(1)界说结构体数组一样平常情势是

① struct 结构体名

    {成员表列} 数组名[数组长度];

② 先声明一个结构体范例,然后再用此范例界说结构体数组:

     结构体范例  数组名[数组长度];

   如:

     struct Person  leader[3];

(2)对结构体数组初始化的情势是在界说数组的反面加上:

={初值表列};

 如:

struct Person  leader[3]= {"Li",0,"Zhang",0,"Fun",0};

例子:

        有3个候选人,每个选民只能投票选一人,要求编一个统计选票的步伐,先后输入被选人的名字,末了输出各人得票结果。
  •解题思绪:  –设一个结构体数组,数组中包罗3个元素  –每个元素中的信息应包罗候选人的姓名(字符型)和得票数(整型)  –输入被选人的姓名,然后与数组元素中的“姓名”成员比力,假如雷同,就给这个元素中的“得票数”成员的值加1 输出全部元素的信息。
代码如下:
  1. #include <string.h>
  2. #include <stdio.h>
  3. struct Person
  4. {
  5.         char name[20];
  6.         int count;
  7. }leader[3] = { “Li”,0,“Zhang”,0,“Sun”,0 };
  8. int main()
  9. {
  10.         int i, j;   char leader_name[20];
  11.         for (i = 1; i <= 10; i++)
  12.         {
  13.                 scanf(“ % s”, leader_name);
  14.                 for (j = 0; j < 3; j++)
  15.                         if (strcmp(leader_name,
  16.                                 leader[j].name) == 0)
  17.                                 leader[j].count++;
  18.         }
  19.         for (i = 0; i < 3; i++)
  20.         {
  21.                 printf("%5s:%d\n",leader[i].name,leader[i].count);
  22.         }
  23.         return 0;
  24. }
复制代码
指向结构体变量的指针:

  •指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。  •指针变量的基范例必须与结构体变量的范例雷同。比方:            struct Student *pt;
例子:

通过指向结构体变量的指针变量输出结构体变量中成员的信息。
解题思绪:在已有的底子上,本题要办理两个标题:
怎样对结构体变量成员赋值;
怎样通过指向结构体变量的指针访问结构体变量中成员。
代码如下
  
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.     struct Student
  6.     {
  7.         long num;
  8.         char name[20];
  9.         char sex;
  10.         float score;
  11.     };
  12.     struct Student stu_1;
  13.     struct Student *p;
  14.     p = &stu_1;
  15.     stu_1.num = 10101;
  16.     strcpy(stu_1.name, "Li Lin");
  17.     stu_1.sex = 'M';
  18.     stu_1.score = 81.5;
  19.     printf("No.:%ld\n", stu_1.num);
  20.     printf("name:%s\n", stu_1.name);
  21.     printf("sex:%c\n", stu_1.sex);
  22.     printf("score:%5.1f\n", stu_1.score);
  23.     return 0;
  24. }
复制代码
   •分析:     –为了利用方便和直观,C语言答应把(*p).num用p->num来取代     –(*p).name等价于p->name     –假如p指向一个结构体变量stu,以劣等价:   
①  stu.成员名(如stu.num)

  
②  (*p).成员名(如(*p).num)

       p->成员名(如p->num)
  指向结构体数组的指针:

  例子:

  有3个门生的信息,放在结构体数组中,要求输出全部门生的信息。
  解题思绪:用指向结构体变量的指针处置惩罚
  (1)声明struct Student,并界说结构体数组、初始化
  (2)界说指向struct Student范例指针p
  (3)使p指向数组首元素,输出元素中各信息
  (4)使p指向下一个元素,输出元素中各信息
  (5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息
  代码如下:
  1. #include <stdio.h>
  2. struct Student                  
  3. { int num;    char name[20];
  4.    char sex;   int age;
  5. };
  6. struct Student stu[3]={
  7.               {10101,"Li Lin",'M',18},
  8.               {10102,"Zhang Fun",'M',19},
  9.               {10104,"Wang Min",'F',20} };
  10. int main()
  11. { struct Student *p;  
  12.    printf(" No.  Name         sex  age\n");
  13.    for(p=stu;p<stu+3;p++)
  14.       printf(“%5d %-20s %2c %4d\n”,
  15.                            p->num, p->name,
  16.                                 p->sex, p->age);
  17.    return 0;
  18. }
复制代码
用结构体变量和结构体变量的指针作函数参数

  将一个结构体变量的值转达给另一个函数,有3个方法。

  
(1) 用结构体变量的成员作参数。

  
  比方,用stu[1].num或stu[2].name作函数实参,将实参值传给形参。

    –用法和用平凡变量作实参是一样的,属于“值转达”方式。     –应当留意实到场形参的范例保持划一。      
(2) 用结构体变量作实参。

   
用结构体变量作实参时,将结构体变量所占的内存单位的内容全部按序次转达给形参,形参也必须是同范例的结构体变量

   
在函数调用期间形参也要占用内存单位。这种转达方式在空间和时间上开销较大

   
在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数

   
一样平常较少用这种方法

   
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地点传给形参。

   
例子:

   
有n个结构体变量,内含门生学号、姓名和3门课程的结果。要求输出均匀结果最高的门生的信息(包罗学号、姓名、3门课程结果宁静均结果)

   
解题思绪:将n个门生的数据表现为结构体数组。按照功能函数化的头脑,分别用3个函数来实现差异的功能:

      –用input函数输入数据和求各门生均匀结果        –用max函数找均匀结果最高的门生        –用print函数输出结果最高门生的信息        –在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。末了得到结果。        –本步伐假设n=3     
代码如下:

   
 

  
  1. #include <stdio.h>
  2. #define N 3
  3. struct Student
  4. {  int num;   
  5.     char name[20];   
  6.     float score[3];   
  7.     float aver;   
  8. };
  9. int main()
  10. { void input(struct Student stu[]);   
  11.    struct Student max(struct Student stu[]);     
  12.    void print(struct Student stu);   
  13.    struct Student stu[N],*p=stu;   
  14.    input(p);   
  15.    print(max(p));   
  16.    return 0;
  17. }
  18. void input(struct Student stu[])   
  19. { int i;
  20.    printf("请输入各学生的信息:
  21.                  学号、姓名、三门课成绩:\n");
  22.    for(i=0;i<N;i++)
  23.    {scanf("%d %s %f %f %f",
  24.                    &stu[i].num,stu[i].name,
  25.               &stu[i].score[0],&stu[i].score[1],
  26.                  &stu[i].score[2]);   
  27.      stu[i].aver=(stu[i].score[0]+
  28.           stu[i].score[1]+stu[i].score[2])/3.0;   
  29.    }
  30. }
  31. struct Student max(struct Student stu[])   
  32. {int i,m=0;   
  33.   for(i=0;i<N;i++)
  34.      if (stu[i].aver>stu[m].aver) m=i;     
  35.   return stu[m];   
  36. } 
  37. void print(struct Student stud)   
  38. { printf("\n成绩最高的学生是:\n");
  39.         printf("学号:%d\n姓名:%s\n 三门课成绩:%5.1f,%5.1f,%5.1f\n 平均成绩:%6.2f\n",
  40. stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);
  41. }
复制代码
     •以上3个函数的调用,情况各不雷同:        –调用input函数时,实参是指针变量,形参是结构体数组,转达的是结构体元素的地点,函数无返回值。        –调用max函数时,实参是指针变量,形参是结构体数组,转达的是结构体元素的地点,函数的返回值是结构体范例数据。        –调用print函数时,实参是结构体变量,形参是结构体变量,转达的是结构体变量中各成员的值,函数无返回值。              往期回顾:

   C语言函数递归经典题型——汉诺塔标题-CSDN博客
   C语言——判断输入字符串是否正当代码分享-CSDN博客
   C语言——字符串指针变量与字符数组(易错分析)-CSDN博客
   C语言——习题训练(一)-CSDN博客
   C语言——指针初阶(三)-CSDN博客
   C语言——海龟作图(对之前全部内容复习)_海龟图c语言-CSDN博客
   C语言——指针初阶(二)-CSDN博客
   C语言——指针初阶(一)_c语言指针p和*p区别-CSDN博客
     
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表