在C++编程中,结构体数组是组合了结构体类型和数组特性的数据结构,能够一次性存储多个具有相同属性集合的数据对象,在实际开发中常用于管理学生信息、员工记录等批量同结构数据。

C++结构体的基本定义
在使用结构体数组之前,首先需要定义结构体类型,结构体可以包含多个不同类型的成员变量,用来描述一个对象的多个属性。下面是一个定义学生结构体的示例:
// 定义学生结构体
struct Student {
int id; // 学生ID
char name[20]; // 学生姓名
float score; // 学生成绩
};
结构体数组的定义方法
定义好结构体类型之后,就可以声明结构体数组,常见的定义方式有以下几种。
方式一:先定义结构体再声明数组
这种方式是最基础的用法,先声明结构体类型,再单独声明结构体数组,数组的长度可以在声明时指定。
#include <iostream>
#include <cstring>
using namespace std;
struct Student {
int id;
char name[20];
float score;
};
int main() {
// 声明长度为3的学生结构体数组
Student stuArr[3];
// 给数组元素赋值
stuArr[0].id = 1001;
strcpy(stuArr[0].name, "张三");
stuArr[0].score = 89.5;
stuArr[1].id = 1002;
strcpy(stuArr[1].name, "李四");
stuArr[1].score = 92.0;
stuArr[2].id = 1003;
strcpy(stuArr[2].name, "王五");
stuArr[2].score = 85.5;
return 0;
}
方式二:声明数组时直接初始化
可以在声明结构体数组的同时,直接为每个元素赋值,这种方式不需要单独逐个给成员变量赋值,代码更简洁。
#include <iostream>
using namespace std;
struct Student {
int id;
char name[20];
float score;
};
int main() {
// 声明时直接初始化结构体数组
Student stuArr[3] = {
{1001, "张三", 89.5},
{1002, "李四", 92.0},
{1003, "王五", 85.5}
};
return 0;
}
方式三:省略数组长度自动推断
如果在初始化时已经给出了所有元素的值,可以省略数组的长度,编译器会自动根据初始化元素的个数确定数组长度。
#include <iostream>
using namespace std;
struct Student {
int id;
char name[20];
float score;
};
int main() {
// 省略数组长度,编译器自动推断长度为3
Student stuArr[] = {
{1001, "张三", 89.5},
{1002, "李四", 92.0},
{1003, "王五", 85.5}
};
return 0;
}
结构体数组的遍历方法
定义好结构体数组之后,通常需要遍历数组来获取或者处理每个元素的数据,常见的遍历方式有以下几种。
方法一:普通for循环遍历
使用普通的for循环,通过下标访问数组的每个元素,这种方式兼容性最好,适合所有C++标准。
#include <iostream>
#include <cstring>
using namespace std;
struct Student {
int id;
char name[20];
float score;
};
int main() {
Student stuArr[] = {
{1001, "张三", 89.5},
{1002, "李四", 92.0},
{1003, "王五", 85.5}
};
// 获取数组长度
int len = sizeof(stuArr) / sizeof(stuArr[0]);
// 普通for循环遍历
for (int i = 0; i < len; i++) {
cout << "学生ID:" << stuArr[i].id << endl;
cout << "学生姓名:" << stuArr[i].name << endl;
cout << "学生成绩:" << stuArr[i].score << endl;
cout << "-------------------" << endl;
}
return 0;
}
方法二:范围for循环遍历(C++11及以上)
C++11引入了范围for循环,不需要手动控制下标,语法更简洁,适合遍历整个数组的场景。
#include <iostream>
using namespace std;
struct Student {
int id;
char name[20];
float score;
};
int main() {
Student stuArr[] = {
{1001, "张三", 89.5},
{1002, "李四", 92.0},
{1003, "王五", 85.5}
};
// 范围for循环遍历
for (Student &stu : stuArr) {
cout << "学生ID:" << stu.id << endl;
cout << "学生姓名:" << stu.name << endl;
cout << "学生成绩:" << stu.score << endl;
cout << "-------------------" << endl;
}
return 0;
}
方法三:使用指针遍历
数组名本质是指向数组首元素的指针,也可以通过指针移动来遍历结构体数组。
#include <iostream>
using namespace std;
struct Student {
int id;
char name[20];
float score;
};
int main() {
Student stuArr[] = {
{1001, "张三", 89.5},
{1002, "李四", 92.0},
{1003, "王五", 85.5}
};
int len = sizeof(stuArr) / sizeof(stuArr[0]);
// 定义指针指向数组首元素
Student *p = stuArr;
// 指针遍历数组
for (int i = 0; i < len; i++) {
cout << "学生ID:" << p->id << endl;
cout << "学生姓名:" << p->name << endl;
cout << "学生成绩:" << p->score << endl;
cout << "-------------------" << endl;
p++; // 指针移动到下一个元素
}
return 0;
}
注意事项
- 结构体数组成员如果是字符数组,赋值的时候不能直接使用赋值号,需要使用<cstring>头文件里的<strcpy>函数,避免内存访问错误。
- 使用范围for循环遍历的时候,如果不需要修改元素的值,可以使用<const>修饰遍历变量,比如<for (const Student &stu : stuArr)>,提升代码安全性。
- 计算结构体数组长度的时候,要使用<sizeof(数组名) / sizeof(数组首个元素)>的方式,不要手动写死长度,避免数组长度修改后遍历出错。