
🔑首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。
🔑 官方来说结构体就是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。说到集合,数组也是集合,但是不同的是数组只能是相同类型元素的集合。
结构体类型的声明:
————————结构体声明样式————————
struct tag
{
member1;
member2;
} variable-list;
————————解释————————
▶ struct是结构体关键字
▶ tag是结构体的标签名,是自定义的
▶ struct tag就是结构体类型
▶ {}里面放的是成员列表
▶ variable-list是变量
▶ member1 , member2 是结构体成员
▶结构体成员的定义方式与变量和数组的定义方式相同
▶结构体成员,只是不能初始化。
🍎结构体的定义与基础结构
知识点1:
结构体的定义:
🔑结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
🔑像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型。
🔑而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
知识点2:
结构体的基础结构:
🔑先定义结构体类型,再定义结构体变量
struct student //结构体类型 或 结构体名
{
int num;
char name[20]; //结构体成员
char sex;
int age;
float score;
char addr[30];
};
struct student stu1,stu2; //结构体变量
🔑定义结构体类型的同时定义结构体变量
struct data // 结构体类型 或结构体名
{
int day int month; //结构体成员
int year
}time1,time2; //结构体变量
🔑直接定义结构体变量
struct // 结构体类型
{
char name[20];
char sex;
int num; //结构体成员
float score[3]
}person1,person2; //结构体变量
注意:
▶只有结构体变量才分配地址,而结构体的定义是不分配空间的
▶结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间
▶结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
🍑结构体的使用
💦结构体的初始化
知识点1:
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
#include <stdio.h>
#include <stdlib.h>
struct books // 结构体类型
{
char title[50];
char author[50]; //结构体成员
char subject[100];
int book_id;
}book={"C 语言","xingaosheng","编程语言",12345}; //结构体变量的初始化
int main()
{
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
return 0;
}

💦结构体的成员访问
知识点1:
🔑为了访问结构的成员,我们使用成员访问运算符(.)。
🔑引用形式:<结构体类型变量名> . <成员名>
注意:结构体变量不能整体引用,只能引用变量成员
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct // 无标签名,匿名结构体
{
char name[20]; //姓名
int num; //学号
int age; //年龄
char group; // 所在小组
float score; // 成绩
}stu1; // 结构体变量
int main()
{
// 给结构体成员赋值
stu1 = { "Tom",12,18,'A',123.3f };
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}

注意:
需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
💦结构体数组
知识点1:
🔑 结构体数组:是指数组中的每一个元素都式结构体。
🔑 结构体数组常被用来表示一个拥有相同数据结构的群体。
struct stu
{
char name[20]; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[5];
//表示一个班有5个人
🔑结构体数组在定义的同时也可以初始化
struct stu
{
char name[20]; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[5] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
🔑当对数组中全部元素赋值时,也可以不给出数组长度
struct stu
{
char name[20]; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
知识点2:
结构体数组的使用:计算全班学生的总成绩、平均成绩和140分一下的人数
#include <stdio.h>
#include <stdlib.h>
struct stu
{
char name[20];
int num;
int age;
char group;
float score;
} ban[5] = {
{"xing",5,18,'c',145.0},{"ao",4,19,'a',130.5},
{"sheng",1,18,'a',148.5},{"pei",2,17,'f',139.0},
{"yuan",3,17,'b',144.5}
}; // 表示一个班有5个人
int main()
{
int i, num_140 = 0;
float sum = 0;
for (i = 0; i < 5; i++) {
sum += ban[i].score;
if (ban[i].score < 140) num_140++;
}
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum / 5, num_140);
return 0;
}
