CC++ & Algorithm

认识C++结构体:给你的数据做个小抽屉

中等24
语言版本:C++Python(暂无)
概述:学习如何用结构体把多个不同类型的数据打包成一个“自定义类型”,就像用一个小盒子装下关于同一个事物的所有信息。

认识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),它比结构体更强大,能放进函数(方法),是面向对象编程的基础。

结构体是你从“单独变量”走向“组织数据”的第一步,加油!

例题精讲

1单选题

在C++中,定义结构体的正确语法是以下哪一个?

Astruct Student { string name; int age; };
Bstruct Student { string name; int age; }
CStudent struct { string name; int age; };
Dstruct { string name; int age; } Student;
2单选题

给定结构体定义:struct Book { string title; double price; }; Book b; 以下哪个选项可以正确给b的成员赋值?

Ab.title = "C++"; b.price = 39.9;
Bb.title = "C++"; b.price = 39.9
CBook.title = "C++"; Book.price = 39.9;
Dtitle = "C++"; price = 39.9;
3判断题

在C++中,定义结构体变量时,必须在结构体名前加上关键字struct。

4填空题
补全下面的代码,定义一个名为Point的结构体,包含两个double类型的成员x和y,并声明一个Point类型的变量p,将p的x赋值为3.5。

___ Point {
  double x;
  double y;
};

int main() {
  ___ p;
  p.___ = 3.5;
  return 0;
}
5填空题
下面的程序定义了一个学生结构体,并创建了一个数组存储两个学生的信息。请补全初始化部分。

struct Student {
  string name;
  int age;
};

int main() {
  Student stu[2] = {___};
  cout << stu[0].name << endl;
  return 0;
}

要求:第一个学生姓名为"Alice",年龄18;第二个学生姓名为"Bob",年龄20。