结构体数组添加元素以及访问元素

113 阅读2分钟

我们需要管理一个学生对象,只需要定义一个 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;
}

image.png

image.png

image.png

image.png

image.png

image.png