结构体数组,平均成绩,指针的三种表示方法

该博客介绍如何使用C语言处理结构体数组,每个结构体包含学生信息和多门课程的成绩。通过指针的三种方法,计算每个学生的平均成绩,并按平均成绩从高到低排序,详细展示了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个结构体数组中存放有若干学生的信息,每个学生有若干门课程的成绩,计算每个学生的平均成绩,并根据平均成绩由高到低的顺序输出每个学生的学号、姓名、和平均成绩(下面的代码里面用指针的三种表示方法实现输出);

#include <iostream>
using namespace std;
#include <string>

struct student{
    string num;
    string name;
    int score[3];
    double avg;
};
int main()
{
    student stu[5]={ {
  
  "2011001","zhao",{
  
  78,65,
在C语言中,指向结构体数组指针是一种非常有用的工具,它允许通过指针访问和操作结构体数组中的元素。通过指针访问结构体成员时,可以使用 `->` 运算符,也可以使用 `(*pointer).member` 的形式。结构体指针的使用方式与普通数组指针类似,因为结构体数组的元素是连续存储的,可以通过指针算术来遍历数组。 在提供的代码中,定义了一个 `struct student` 类型的数组 `stu[3]`,并声明了一个指向该结构体类型的指针 `p`。在 `for` 循环中,`p` 被初始化为指向数组的起始位置 `stu`,然后通过 `p < stu + 3` 控制循环的结束条件,每次循环中使用 `p++` 将指针移动到下一个结构体元素的位置。在循环体内,通过 `p->num`、`p->name`、`p->age` 和 `p->score` 来访问结构体成员,并将其打印出来[^1]。 结构体指针的另一种常见用法是将其指向结构体数组的某个特定位置,从而实现类似数组下标的功能。例如: ```c struct student a[3]; struct student *p = a; ``` 此时,`p` 指向数组 `a` 的第一个元素,可以通过 `p[0]`、`p[1]` 和 `p[2]` 来访问数组中的各个结构体元素。同样,也可以使用 `(*(p + i)).member` 来访问结构体成员,其中 `i` 是数组索引值[^3]。 ### 示例代码 以下是一个完整的示例代码,展示了如何使用指向结构体数组指针: ```c #include <stdio.h> struct student { int num; char name[20]; int age; int score; }; int main() { struct student stu[3] = { {101, "feifie", 18, 99}, {102, "baibai", 19, 89}, {103, "xixi", 18, 76} }; struct student *p; printf("学号\t姓名\t年龄\t平均分成绩\t\n"); for (p = stu; p < stu + 3; p++) { printf("%5d%10s%4d%10d\n", p->num, p->name, p->age, p->score); } return 0; } ``` 该程序的输出如下: ``` 学号 姓名 年龄 平均分成绩 101 feifie 18 99 102 baibai 19 89 103 xixi 18 76 ``` ### 使用结构体指针访问数组元素的多种方式 除了使用 `p->member` 的方式访问结构体成员,还可以使用以下方式: - `(*p).member`:先对指针进行解引用,然后使用点号 `.` 访问成员。 - `(*(p + i)).member`:访问指针偏移 `i` 个位置后的结构体成员。 例如: ```c for (int i = 0; i < 3; i++) { printf("%5d%10s%4d%10d\n", (*(p + i)).num, (*(p + i)).name, (*(p + i)).age, (*(p + i)).score); } ``` 这与使用 `p[i].num` 的方式是等价的。 ### 总结 指向结构体数组指针可以像普通数组一样进行遍历和访问。通过指针算术和成员访问运算符(`->` 或 `(*pointer).member`),可以高效地操作结构体数组中的元素。这种技术在处理结构化数据时非常有用,例如在处理学生信息、员工记录等场景中[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值