我们需要管理一个学生对象,只需要定义一个 struct Student kelei;(定义结构体变量,只是一个对象)
假如:我们需要管理一个班的学生对象,此时就需要定义一个结构体数组 struct Student stus[33];(定义结构体数组,定义多个对象);
#include <stdio.h>
// 定义结构体
struct Student {
char *name; // 姓名(使用指针)
int age; // 年龄
float score[3]; // 三门课的成绩
};
int main() {
// 声明结构体数组并初始化
struct Student stus[3] = {
{"加福德", 27, {88, 77, 66}},
{"凯里.欧文", 33, {99, 88, 77}},
// 第三个学生未初始化,后续手动赋值
};
// 手动为第三个学生赋值
stus[2].name = "张三";
stus[2].age = 20;
stus[2].score[0] = 90;
stus[2].score[1] = 80;
stus[2].score[2] = 70;
// 打印学生信息
for (int i = 0; i < 3; i++) {
printf("学生%d: 姓名=%s, 年龄=%d, 成绩=[%.1f, %.1f, %.1f]\n",
i + 1, stus[i].name, stus[i].age,
stus[i].score[0], stus[i].score[1], stus[i].score[2]);
}
return 0;
}
struct Student stus[3] 是一个包含3个元素的数组,每个元素都是一个 struct Student 结构体。
内存中按顺序排列,每个结构体实例的成员也按声明顺序存储:
stus[0]: {name, age, score[3]}
stus[1]: {name, age, score[3]}
stus[2]: {name, age, score[3]}
用指针的方式访问
#include <stdio.h>
/* 定义全局Student结构体 */
struct Student {
int id;
char *name;
int age;
float scores[3];
void (*info)(char *, int); // 函数指针,用于输出学生信息
};
/**
* 输出学生信息的函数
* @param name 学生姓名
* @param age 学生年龄
*/
void info(char *name, int age) {
printf("大家好,我是%s,今年%d岁啦!\n", name, age);
}
/**
* 功能函数:初始化学生数据并遍历输出
*/
void func() {
// 初始化学生结构体
struct Student stu1 = {1, "张三", 21, {78, 88, 98}, info};
struct Student stu2 = {2, "李四", 22, {90, 98, 78}, info};
// 将学生存入数组
struct Student stus[] = {stu1, stu2};
// 计算数组长度
int len = sizeof(stus) / sizeof(stus[0]);
// 使用指针遍历数组
struct Student *p = stus;
for (; p < stus + len; p++) {
// 打印学生基本信息
printf("%d, %s, %d, %.2f, %.2f, %.2f\n",
p->id, p->name, p->age,
p->scores[0], p->scores[1], p->scores[2]);
// 调用函数指针输出自我介绍
p->info(p->name, p->age);
}
printf("\n");
}
int main(int argc, char *argv[]) {
func(); // 执行主要逻辑
return 0;
}