结构体的具体应用:通常用来存储一个有同类性质的个体组成的群体
eg.
姓名 | 学号 | 成绩 |
小红 | 10 | 100 |
小明 | 11 | 90 |
当我们用数组来存取这些信息的时候,想要一一对应就会很复杂
结构体就是用来整体化存取这类信息。
定义结构体及结构体变量
形式:
type1: 先声明结构体类型,再定义结构体变量
struct 结构体名
{
类型标识符 成员名1;
类型标识符 成员名2;
...;
};
struct 结构体名 变量名1,变量名2,...;
eg1.
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
};//分号别漏了!
struct student stu1,stu2;
type 2: 定义结构体类型的同时定义变量
struct 结构体名
{
类型标识符 成员名1;
类型标识符 成员名2;
...;
}变量名1,变量名2,...;
eg2.
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
}stu1,stu2;//分号别漏了!
type 3: 不指定类型名,直接定义结构体类型变量(不建议使用)
struct //不指定类型名
{
类型标识符 成员名1;
类型标识符 成员名2;
...;
}变量名1,变量名2,...;
eg3.
struct //不指定类型名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
}stu1,stu2;//分号别漏了!
tips:
student 是结构体名
3-5行为成员表列
stu1和stu2为变量名
区分结构体类型名和结构体变量
结构体类型名 结构体变量 不分配存储空间 分配存储空间 结构体定义最后的 “ ; ”注意别漏
成员名和变量名重名没关系
引用结构体
应用结构体变量中的一个成员的形式:
结构体变量名.变量名
eg.
student.name
结构体变量初始化
形式:
{}内按成员表列依次初始化
直接上例子:
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
}stu1={"小红",10,100};//分号别漏了!
很多时候结构体数组更方便
type1:
eg.
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
};
struct student stu[2];//能存两个同学
stu[2]={{"小红",10,100},{"小明",11,90}};//分号别漏了!
也可以把内层大括号略去
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
};
struct student stu[2];//能存两个同学
stu[2]={"小红",10,100,"小明",11,90};//分号别漏了!
type2:
eg.
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
}stu[2];//能存两个同学
stu[2]={{"小红",10,100},{"小明",11,90}};//分号别漏了!
总例:(可运行)
#include<stdio.h>
struct student//结构体名
{
char name[20];//存取字符串用字符数组,记录姓名
int num;//记录学号
int score;//记录成绩
}stu[2];//能存两个同学
main()
{
struct student stu[2]={{"小红",10,100},{"小明",11,90}};
int i;//定义循环变量
for(i=0;i<=1;i++)
{
printf("姓名:%s\n学号:%d\n成绩:%d\n",stu[i].name,stu[i].num,stu[i].score);
}
}
结构体的嵌套
结构体可以套结构体,用例子引出体会
定义:
struct date
{
int year;
int month;
int day;
};
struct person_birth
{
char name[20];
char gender;
struct date birthday;//上一个结构体变量,此处出现嵌套
}person;
可见,结构体嵌套,是在结构体中有对另一个结构体变量定义。
调用:
用多个"."
直接上总例,调用部分会在注释部分标出,留意一下
eg.
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
struct person_birth
{
char name[20];
char gender;
struct date birthday;//上一个结构体变量,此处出现嵌套
};
main()
{
struct person_birth person[5];
int i;//定义循环变量
for(i=0;i<=4;i++)//由person[5]得出能记录5个人,i<=4
{
printf("输入成员数据:\n");
printf("姓名:\n");
scanf("%s",&person[i].name);//此处还未用到嵌套
printf("性别:\n");
scanf("%c",&person[i].gender);//此处还未用到嵌套
printf("出生年份:\n");
scanf("%d",&person[i].birthday.year);//结构体嵌套调用!
printf("出生月:\n");
scanf("%d",&person[i].birthday.month);//结构体嵌套调用!
printf("出生日:\n");
scanf("%d",&person[i].birthday.day);//结构体嵌套调用!
}
//输入部分结束,接下来是输出
printf("接下来输出成员信息\n");
for(i=0;i<=4;i++)//由person[5]得出能记录5个人,i<=4
{
printf("姓名:%s\n性别:%c\n出生日期:%d年%d月%d日\n",person[i].name,person[i].gender,person[i].birthday.year,person[i].birthday.month,person[i].birthday.day);
}
}
tips:
结构体的存入和调用一般都会用到循环
结构体在主函数前时,注意在主函数中要定义或声明结构体变量,如上例中的第19行
结构体定义后的那个分号不要漏
较难的链表在第九章之后更新,可以自行翻看(或等后续更新)
下一章节:指针(章节:9/9)
p.s.
小红书,知乎等平台搜索知识薪火站,也会上传相应笔记,感谢关注。
有建议欢迎提出!