结构体数组

结构体数组

一句话理解:结构体是描述一个对象的模板,结构体数组就是批量存放多个同类型对象。 比如:一个学生信息是结构体,全班几十个学生,就用结构体数组保存。

1. 结构体基础回顾(C 语言)

// 定义结构体类型:学生
struct Student
{
    int id;         // 学号
    char name[20];  // 姓名
    float score;    // 分数
};

struct Student 是类型,就像 int,只不过是我们自定义的类型。

2. 定义结构体数组

方式 1:先定义结构体,再定义数组

struct Student stu[3]; // 结构体数组,存放3个学生
  • stu 是数组名,数组有 3 个元素:stu[0]、stu[1]、stu[2]
  • 每个元素都是 struct Student 结构体变量

方式 2:定义结构体同时定义数组

struct Student
{
    int id;
    char name[20];
    float score;
} stu[3];

3. 结构体数组初始化

struct Student stu[3] = {
    {1001, "Zhang", 90.5},
    {1002, "Li", 88.0},
    {1003, "Wang", 95.0}
};

外层大括号代表数组,里面每一对{}对应一个结构体成员。

也可以部分初始化,没写的成员自动置 0:

struct Student stu[3] = {
    {1001, "Zhang", 90.5},
};

4. 访问结构体数组成员

语法:数组下标.成员名

stu[0].id = 1001;
stu[0].score = 92;
printf("%d %s %.1f\n", stu[0].id, stu[0].name, stu[0].score);

⚠️ 重点区分:

  • . 结构体变量访问成员
  • -> 结构体指针访问成员

5. 完整示例代码(C)

#include <stdio.h>

struct Student
{
    int id;
    char name[20];
    float score;
};

int main(void)
{
    // 结构体数组
    struct Student stu[3] = {
        {1001, "Zhang", 90.5},
        {1002, "Li", 88.0},
        {1003, "Wang", 95.0}
    };

    // 遍历结构体数组
    for(int i = 0; i < 3; i++)
    {
        printf("学号:%d 姓名:%s 分数:%.1f\n",
               stu[i].id, stu[i].name, stu[i].score);
    }

    return 0;
}

6. 结构体数组 + 结构体指针(高频考点)

数组名本身就是首元素地址。 stu 等价于 &stu[0],类型是 struct Student *

struct Student *p = stu;
// 两种写法等价
printf("%d", p->id);
printf("%d", stu[0].id);

p++; // 指针向后移动一个结构体大小,指向stu[1]

p++ 不是移动 1 字节,是移动整个结构体占用的字节数!

7. 常用场景

  • 保存多条同类数据:学生、员工、设备参数、坐标点
  • 串口解析多组数据、存储多个传感器信息(嵌入式 MCU 非常常用)

8. C++ 写法(简单对比)

C++ 可以不用写struct:

struct Student
{
    int id;
    char name[20];
    float score;
};

Student stu[3];

9. 常见坑

  1. 混淆 . 和 ->:变量用.,指针用->
  2. 字符串不能直接 stu[0].name="aaa",要用strcpy
  3. 结构体数组作为函数参数,传递的是结构体指针,会共享原数据
posted @ 2026-09-19 10:31  Sean_hn  阅读(24)  评论(0)    收藏  举报