结构体
前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合。
但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。
我们可以使用结构体(Struct)来存放一组不同类型的数据。
结构体的定义形式为:
struct 结构体名
{
成员列表
};
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。
struct STU{
string name; //姓名
int num; //学号
int age; //年龄
double score; //成绩
};
STU 为结构体名,它包含了 4 个成员,分别是 name、num、age、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。
注意
注意大括号后面的分号 ; 不能少,这是一条完整的语句。
结构体也是一种数据类型,它由我们自己定义,可以包含多个其他类型的数据。
像 int、float、char 等是由 C 语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;
而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
结构体变量
既然结构体是一种数据类型,那么就可以用它来定义变量。例如:
STU stu1,stu2;
定义了两个变量 stu1 和 stu2,它们都是 STU 类型,都由 4 个成员组成。
你也可以在定义结构体的同时定义结构体变量:
struct STU{
string name; //姓名
int num; //学号
int age; //年龄
double score; //成绩
}stu1,stu2;
将变量放在结构体定义的最后即可。
结构体变量的引用
- 不能将一个结构体变量作为一个整体进行输入和输出。
只能对结构体变量中的各个成员分别进行输入输出。引用结构体变量中的成员的方式为:
结构体变量名.成员名
结构体变量的引用 示例代码
#include<bits/stdc++.h>
using namespace std;
struct STU{
string name; //姓名
int num; //学号
int age; //年龄
double score; //成绩
};
int main()
{
STU stu1,stu2;
cout << "请输入stu1变量的信息:" << endl;
cout << "请输入姓名:" ;
cin >> stu1.name ;
cout << "请输入学号:" ;
cin >> stu1.num ;
cout << "请输入年龄:" ;
cin >> stu1.age ;
cout << "请输入成绩:" ;
cin >> stu1.score;
cout << "stu1变量的信息如下:" << endl;
cout << "姓名:" << stu1.name << endl;
cout << "学号:" << stu1.num << endl;
cout << "年龄:" << stu1.age << endl;
cout << "成绩:" << stu1.score << endl;
return 0;
}`'/>
运行结果:
```c
请输入stu1变量的信息:
请输入姓名:oldmoon↙(表示输入结束)
请输入学号:1↙
请输入年龄:20↙
请输入成绩:100↙
stu1变量的信息如下:
姓名:oldmoon
学号:1
年龄:20
成绩:100
注意
stu1.age 表示 stu1 变量中的 age 成员,可以对变量的成员赋值。例如: stu1.age = 18; 表示把 18 复制给 stu1 变量中的成员 age。
- 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。
stu2.score = stu1.score;
s = stu1.score + stu2.score;
++ stu1.age;
分析
3 条语句分别对应的含义是:
1、将变量 stu1 的成员 score 值赋值给变量 stu2 的 score 成员;
2、s 变量的值等于变量 stu1 的 score 成员值 + stu2 的 score 成员值;
3、将变量 stu1 的成员 age 值自增 1
- 可以引用结构体变量成员的地址。也可以引用结构体变量的地址。如:
scanf("%d", &stu1.age);// 输入 stu1.age 的值
printf("%p", &student1);// 输出 student1 的首地址
注意
%p 是打印地址的,是十六进制的形式。
结构体变量的初始化
- 定义结构体变量时同时赋值,例如创建结构体变量 stu1 的同时初始化。
STU stu1 = {"oldmoon",1,20,100};
- 定义后赋值
STU stu1;
cin >> stu1.name >> stu1.num >> stu1.age >> stu1.score;
结构体数组
- 定义结构体数组
结构体数组格式: 声明变量类型 数组名称[数组长度]
STU stu[3];
以上定义了一个数组 stu,其元素为 struct STU 类型数据,数组有 3 个元素。
也可以直接定义一个结构体数组:
struct STU{
string name; //姓名
int num; //学号
int age; //年龄
double score; //成绩
}stu[3];
- 结构体数组的初始化 同结构体变量一样,结构体数组也可定义时初始化,也可定义后赋值;
定义时赋值:
STU stu[3] = {{"oldmoon1",1,20,100},
{"oldmoon2",2,19,99.5},
{"oldmoon3",3,18,90}};
注意
每一个数组元素都用一个{}进行包括
定义后赋值:
可借助 for 循环进行输入
for(int i=0;i<3;i++){
cin >> stu[i].name >> stu[i].num >> stu[i].age >> stu[i].score;
}
- 结构体数组的示例
结构体数组 示例代码
#include<bits/stdc++.h>
using namespace std;
struct STU{
string name; //姓名
int num; //学号
int age; //年龄
double score; //成绩
};
int main()
{
STU stu[3];
for(int i=0;i<3;i++){
cout << "请输入第" << i + 1 << "个学生的名字:" ;
cin >> stu[i].name ;
cout << "请输入第" << i + 1 << "个学生的学号:" ;
cin >> stu[i].num ;
cout << "请输入第" << i + 1 << "个学生的年龄:" ;
cin >> stu[i].age ;
cout << "请输入第" << i + 1 << "个学生的成绩:" ;
cin >> stu[i].score ;
}
cout<< endl;
for(int i=0;i<3;i++){
cout << "第" << i + 1 << "个学生信息如下" << endl;
cout << "姓名:" << stu[i].name << endl;
cout << "学号:" << stu[i].num << endl;
cout << "年龄:" << stu[i].age << endl;
cout << "成绩:" << stu[i].score << endl;
}
return 0;
}
运行结果:
请输入第1个学生的名字:oldmoon1↙(表示输入结束)
请输入第1个学生的学号:1↙
请输入第1个学生的年龄:20↙
请输入第1个学生的成绩:100↙
请输入第2个学生的名字:oldmoon2↙
请输入第2个学生的学号:2↙
请输入第2个学生的年龄:19↙
请输入第2个学生的成绩:99.5↙
请输入第3个学生的名字:oldmoon3↙
请输入第3个学生的学号:3↙
请输入第3个学生的年龄:18↙
请输入第3个学生的成绩:90↙
第1个学生信息如下
姓名:oldmoon1
学号:1
年龄:20
成绩:100
第2个学生信息如下
姓名:oldmoon2
学号:2
年龄:19
成绩:99.5
第3个学生信息如下
姓名:oldmoon3
学号:3
年龄:18
成绩:90
注意
结构体数组借助 for 循环进行输入输出