大家好啊!这里是阳阳的博客,一个正在努力学习技术的大学生。
上一篇我们聊了结构体的基本概念,知道了结构体可以把多个相关变量打包成一个整体。
今天这篇继续往下看结构体的几个常用操作:结构体变量怎么初始化、能不能整体赋值,以及多个结构体变量怎么用数组保存。好了,废话不多说,咱们直接开始。
结构体变量的初始化
上一篇我们写过这样的代码:
struct Student { string name; int age; double score; }; Student stu; stu.name = "Tom"; stu.age = 18; stu.score = 92.5;这种写法很清楚,先定义结构体变量,再一个成员一个成员地赋值。
如果想写得更紧凑一点,也可以在定义变量时直接初始化:
Student stu = {"Tom", 18, 92.5};这里的顺序要和结构体里成员出现的顺序对应。
结构体定义是:
struct Student { string name; int age; double score; };所以初始化时:
{"Tom", 18, 92.5}分别对应:
name -> "Tom" age -> 18 score -> 92.5完整代码如下:
#include <iostream> #include <string> using namespace std; struct Student { string name; int age; double score; }; int main() { Student stu = {"Tom", 18, 92.5}; cout << stu.name << endl; cout << stu.age << endl; cout << stu.score << endl; return 0; }结构体变量可以整体赋值
结构体还有一个挺方便的地方:同类型的结构体变量之间可以直接赋值。
比如:
Student a = {"Tom", 18, 92.5}; Student b; b = a;这表示把a里面的所有成员复制给b。
完整示例:
#include <iostream> #include <string> using namespace std; struct Student { string name; int age; double score; }; int main() { Student a = {"Tom", 18, 92.5}; Student b; b = a; cout << b.name << endl; cout << b.age << endl; cout << b.score << endl; return 0; }输出结果和a的内容一样。
这里可以把结构体变量理解成一个资料袋。b = a;就像把a资料袋里的姓名、年龄、成绩都复制一份,放进b这个资料袋里。
这个地方和数组有点不一样。普通数组不能直接这样整体赋值:
int a[3] = {1, 2, 3}; int b[3]; b = a; // 错误但结构体变量可以直接赋值,只要它们是同一种结构体类型。
结构体数组:保存一组学生
如果只保存一个学生,用一个结构体变量就够了。
但如果要保存多个学生,就可以用结构体数组。
比如:
Student stu[3];这表示定义了一个数组,里面有 3 个元素,每个元素都是一个Student类型。
可以这样赋值:
stu[0] = {"Tom", 18, 92.5}; stu[1] = {"Jack", 19, 88.0}; stu[2] = {"Lucy", 18, 95.0};访问时也很自然:
cout << stu[0].name << endl; cout << stu[1].score << endl;这里可以拆开看:
stu[0]表示数组里的第一个学生。
stu[0].name表示第一个学生的姓名。
完整代码如下:
#include <iostream> #include <string> using namespace std; struct Student { string name; int age; double score; }; int main() { Student stu[3] = { {"Tom", 18, 92.5}, {"Jack", 19, 88.0}, {"Lucy", 18, 95.0} }; for(int i = 0; i < 3; i++) { cout << stu[i].name << " "; cout << stu[i].age << " "; cout << stu[i].score << endl; } return 0; }结构体数组很适合保存一组“有多个属性的数据”。
以前我们用数组保存成绩:
int score[3];它只能保存一组整数。
现在用结构体数组保存学生:
Student stu[3];每个学生里面都有姓名、年龄、成绩。这样数据组织起来会清楚很多。
用结构体数组找最高分
结构体数组经常会和循环一起使用。比如现在有 3 个学生,想找出成绩最高的学生。
代码可以这样写:
#include <iostream> #include <string> using namespace std; struct Student { string name; int age; double score; }; int main() { Student stu[3] = { {"Tom", 18, 92.5}, {"Jack", 19, 88.0}, {"Lucy", 18, 95.0} }; int index = 0; for(int i = 1; i < 3; i++) { if(stu[i].score > stu[index].score) { index = i; } } cout << stu[index].name << " "; cout << stu[index].score << endl; return 0; }这里的index用来记录当前最高分学生的位置。
一开始先认为第一个学生最高:
int index = 0;然后从第二个学生开始比较。如果发现stu[i].score更高,就更新index。
这道题其实和数组里找最大值很像,只不过以前比较的是:
a[i]现在比较的是:
stu[i].score比较的是每个结构体里的某个成员。
需要注意的地方
结构体数组刚开始最容易混的是点号和下标的顺序。
正确写法是:
stu[i].name它表示第i个学生的姓名。
有些同学可能会写成:
stu.name[i]这样就不对了,因为stu是一个数组,必须先用下标取出某一个学生,再用点号访问这个学生的成员。
总结
今天这篇我们继续练了结构体的几个常见用法:
结构体变量可以逐个成员赋值。
结构体变量可以用
{}直接初始化。同类型结构体变量之间可以整体赋值。
多个结构体变量可以放进结构体数组。
结构体数组常和循环一起使用。
结构体数组看起来会比普通数组长一点,但思路并不复杂。
那这篇就先到这里。如果觉得有帮助,记得点赞、关注和收藏,谢谢!😄
有什么问题欢迎在评论区留言,我们一起交流。
我们下篇见~