认识C++结构体:给你的数据做个小抽屉
中等24认识C++结构体:把你的数据放进小抽屉
你有没有遇到过这样的情况:想记录一个学生的信息,比如他的名字、年龄、身高。如果只用变量,就要分别定义:
string name; // 姓名
int age; // 年龄
double height; // 身高(米)
这样很麻烦,而且这三个变量其实属于同一个人,应该“绑在一起”。C++里的结构体(struct),就像你课桌上的小抽屉——可以把关于同一事物的所有东西放进去,方便又整洁。
结构体可以帮我们把多个不同类型的变量打包成一个“自定义类型”,以后想描述一个学生、一个游戏角色、一本图书……都只需一个变量就够了。
什么是结构体?它能干什么?
结构体就像一张“设计图”,画出一个抽屉里该放哪些东西。之后每当你需要一个新的“抽屉”,就照着这张设计图做一个,然后往里面装数据就行。
- 它可以把多个变量(比如名字、年龄、身高)组合成一个整体。
- 这个整体可以像普通变量一样使用:创建、赋值、传参、放进数组……
- 使用结构体可以让代码更清晰,不用到处散落一堆孤立的变量。
如何定义结构体?
结构体一般定义在 #include 之后、主函数 main 之前,这样整个程序都能用。语法超级简单:
struct 结构体名称 {
数据类型 成员1;
数据类型 成员2;
// 还可以有更多成员
}; // 注意这里的分号不能少!
例如,定义一个“学生”结构体:
#include <iostream>
#include <string>
using namespace std;
struct Student { // 结构体名称:Student
string name; // 姓名
int age; // 年龄
double height; // 身高,单位:米
}; // 分号结束定义
int main() {
// 创建结构体变量,就像按照设计图做出一个真正的抽屉
Student stu1; // 定义一个 Student 类型的变量 stu1
stu1.name = "小明"; // 往抽屉里放名字
stu1.age = 10; // 放年龄
stu1.height = 1.4; // 放身高
// 访问成员用点号 .
cout << stu1.name << " 今年"
<< stu1.age << "岁,身高"
<< stu1.height << "米" << endl;
// 也可以定义时直接赋值(列表初始化)
Student stu2 = {"小红", 9, 1.3}; // 顺序要跟定义时一致
cout << stu2.name << " 今年"
<< stu2.age << "岁,身高"
<< stu2.height << "米" << endl;
return 0;
}
输出:
小明 今年10岁,身高1.4米
小红 今年9岁,身高1.3米
结构体成员访问:点号(.)就像钥匙
创建好结构体变量后,想读写里面的某个成员,就用点号“.”。比如 stu1.name 表示“stu1 这个学生的名字”。
你可以像操作普通变量一样操作它:赋值、输出、计算……
Student stu3;
stu3.name = "小刚";
stu3.age = 11;
stu3.height = 1.5;
cout << stu3.name << "的身高是" << stu3.height << "米" << endl;
另一种初始化方式:边定义边塞值
除了先定义再挨个赋值,还可以在定义时直接用花括号给成员按顺序赋值。这就像你做一个新的抽屉时,直接把东西摆好再关上。
Student stu4 = {"小丽", 10, 1.38}; // 依次给 name, age, height 赋值
注意顺序必须和结构体定义中成员的顺序完全一致,而且每个成员都要有值(除非你允许缺省,但初学者先都写上)。
结构体数组:存下全班同学的信息
如果只有一个学生,用结构体很方便。要是有30个学生呢?那就把结构体放进数组里,像普通数组一样用下标访问。
Student classRoom[30]; // 全班30个同学,每个都是 Student 类型
classRoom[0].name = "张三"; // 第一位同学
classRoom[0].age = 11;
classRoom[1].name = "李四"; // 第二位同学
// ...
也可以在定义时直接初始化整个数组(适合数据已知的情况):
Student classRoom[3] = {
{"小明", 10, 1.4},
{"小红", 9, 1.3},
{"小刚", 11, 1.5}
};
for (int i = 0; i < 3; i++) {
cout << classRoom[i].name << " "
<< classRoom[i].age << "岁 "
<< classRoom[i].height << "米" << endl;
}
新手最容易犯的3个错误
错误1:忘记在结构体定义末尾加分号
struct Student {
string name;
int age;
} // 少了分号,编译会报错!
正确写法:}; 分号一定要有,它表示结构体定义结束。
错误2:定义结构体时漏掉了某些成员的类型
struct Book {
string title;
int pages;
double price;
// 如果写成 price,忘记 double,会报错:缺少类型说明符
};
错误3:把结构体定义放在了 main 函数里面
虽然语法上允许(局部结构体),但通常为了其他函数也能用,建议写在最外面。养成好习惯:结构体定义放在 #include 之后、main 之前。
#include <iostream>
using namespace std;
struct MyStruct { ... }; // 正确位置
int main() {
// ...
}
完整示例:用结构体记录一个游戏角色
下面是一个完整的程序,定义一个“角色”结构体,包含姓名、等级、血量,然后创建两个角色并PK(模拟攻击)。
#include <iostream>
#include <string>
using namespace std;
struct Hero {
string name; // 角色名
int level; // 等级
int hp; // 血量
};
int main() {
// 创建两个角色
Hero hero1 = {"勇士", 10, 100};
Hero hero2 = {"法师", 8, 80};
// 输出初始信息
cout << hero1.name << ":等级" << hero1.level
<< ",血量" << hero1.hp << endl;
cout << hero2.name << ":等级" << hero2.level
<< ",血量" << hero2.hp << endl;
// 模拟攻击:英雄1攻击英雄2,减少20点血量
hero2.hp -= 20;
cout << hero1.name << "攻击了" << hero2.name << "!" << endl;
cout << hero2.name << "剩余血量:" << hero2.hp << endl;
return 0;
}
输出示例:
勇士:等级10,血量100
法师:等级8,血量80
勇士攻击了法师!
法师剩余血量:60
动手试一试:定义“汽车”结构体
按照我们学过的,你可以试着定义一个结构体 Car,包含三个成员:品牌(string)、颜色(string)、价格(double)。然后创建两辆汽车,输出它们的信息。参考代码框架:
#include <iostream>
#include <string>
using namespace std;
struct Car {
string brand; // 品牌
string color; // 颜色
double price; // 价格(万元)
};
int main() {
// 你的代码写在这里
// 创建 Car 变量,赋值,输出
return 0;
}
试试看,把它补充完整吧!
接下来还可以学什么?
学会结构体之后,你能把数据打包成一个个“小抽屉”。接下来你可以:
- 学习函数,把结构体作为参数传进函数,处理数据更方便。
- 学习结构体数组,用循环批量处理大量数据(比如全班同学的成绩)。
- 学习结构体嵌套,在一个结构体里面放另一个结构体(比如“学生”结构体里加一个“生日”结构体)。
- 将来还可以学习类(class),它比结构体更强大,能放进函数(方法),是面向对象编程的基础。
结构体是你从“单独变量”走向“组织数据”的第一步,加油!
例题精讲
在C++中,定义结构体的正确语法是以下哪一个?
给定结构体定义:struct Book { string title; double price; }; Book b; 以下哪个选项可以正确给b的成员赋值?
在C++中,定义结构体变量时,必须在结构体名前加上关键字struct。
补全下面的代码,定义一个名为Point的结构体,包含两个double类型的成员x和y,并声明一个Point类型的变量p,将p的x赋值为3.5。
___ Point {
double x;
double y;
};
int main() {
___ p;
p.___ = 3.5;
return 0;
}下面的程序定义了一个学生结构体,并创建了一个数组存储两个学生的信息。请补全初始化部分。
struct Student {
string name;
int age;
};
int main() {
Student stu[2] = {___};
cout << stu[0].name << endl;
return 0;
}
要求:第一个学生姓名为"Alice",年龄18;第二个学生姓名为"Bob",年龄20。