结构体

本文最后更新于:a minute ago

存储某一组信息的绝佳选择——结构体。

我们不妨假设一个情景:

你需要统计多名学生的基本信息,每个人需要统计的信息如下

  • 姓名(拼音)
  • 学号(首字符是令你延误的0)
  • 性别(F/M)
  • 生日

单纯的使用数组和字符串当然可以实现功能,但分散的存储并不利于后续的操作。这个时候你就开始想,将这些个不同类型的数据捆绑存储在一起,而这就是结构体的功能。

声明

RE:从零开始声明一个结构体

1
2
3
4
5
6
struct 结构体标签 {
变量1
变量2
变量3
……
} 结构体变量1,结构体变量2,……;

结构体标签、结构体变量名和结构体的变量只要出现任意两者,就是一个合法的结构体,这一部分的例子会在下面出现。

1
2
3
4
5
6
struct studentinfo{
char name[20];
int id[20];
char sex;
int birhtday[3];
}

嵌套声明

还是以统计学生信息的情景为例,你希望可以单独存储生日的年月日。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Date{
int year;
int month;
int day;
};
//注意这里并没有声明结构体变量,仅有标签Date。

//注意这里并没有打结构体标签。
struct {
char name[20];
int id[20];
char sex;
struct Date birthday; //注意这个元素
}student1,student2,student3;

一次声明一组结构体

还是统计学生信息的情景。由于我们并不知道会有多少名学生(但有可能很多)。如果student1 student2这样一个个声明结构体变量就未免显得有点麻烦。因此我们可以一次声明一组。

1
2
3
4
5
6
struct stuinfo{
char name[20];
int id[20];
char sex;
struct Date birthday;
}student[30];

调用

先说简单的

这个时候我们要存入某个学生的名字。那么我们知道,名字存储在结构体student[]中。
元素写法如下:

1
student[0].name

语句写法如下:

1
scanf("%s",student[0].name);

再说点复杂的

该存入生日了,但是这个时候你发现,生日并不直接存入stuinfo中,而是存在stuinfo里嵌套的Date中。
其实很简单。
元素写法如下:

1
student[0].birthday.day

语句写法如下:

1
scanf("%d",student[0].birthday.day);

高阶点的操作

不声明变量

假设我们需要对学生根据生日进行排序。你会拍着大腿说:“冒泡排序,这个我熟悉。”
事实上,对结构体进行冒泡排序和对整型数组进行冒泡排序并没有差多少。
首先我们声明一个中间变量

1
struct stuinfo temp;

你看,这里声明了一个temp的结构体,但是并没有写任何变量。由于标签使用
stuinfotemp这个结构体的内部和student[0]的内部是一样的。

1
2
3
4
5
if(student[i].birthday.year>student[i+1].birthday.year){
temp=student[i];
student[i]=student[i+1];
student[i+1]=temp;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!