C语言编程指向结构体数组的指针

输入几名学生的姓名和成绩,按成绩排序。
2024-11-19 00:25:26
推荐回答(2个)
回答1:

下面的程序是我以前写的,你稍微改改就能符合你的要求了

#include 
#include 
typedef struct st
{
    char name[20];
    int chinese;
    int math;
    int english;
    float average;
}student;
void swap(student *a, student *b)
{
    student temp = *a;
    *a = *b;
    *b = temp;
}
void sort(student *array, int n)
{
    int i, j, flag;
    for (i = 0; i < n - 1; i++)
    {
        flag = 1;
        for (j = 0; j < n - i - 1; j++)
        {
            if (array[j].average > array[j + 1].average)
            {
                swap(array + j, array + j + 1);
                flag = 0;
            }
        }
        if (flag)
            break;
    }
}
void print(student *array, int n)
{
    int i;
    printf("姓名\t语文\t数学\t英语\t平均成绩\n");
    for (i = 0; i < n; i++)
    {
        printf("%s\t%d\t%d\t%d\t%f\n", array[i].name, array[i].chinese,
            array[i].math, array[i].english, array[i].average);
    }
}
int main()
{
    int number = 9;
    int i;
    student *stu = (student *)malloc(sizeof(student) * 9);
    for (i = 0; i < number; i++)
    {
        printf("请输入第%d个学生的姓名及成绩(姓名 语文 数学 英语成绩以空格隔开):\n", i + 1);
        scanf("%s %d %d %d", (*(stu + i)).name, &(*(stu + i)).chinese, 
            &(*(stu + i)).math, &(*(stu + i)).english);
        (*(stu + i)).average = ((*(stu + i)).chinese + 
            (*(stu + i)).math + (*(stu + i)).english) / (float)3.0;
    }
    print(stu, number);
    sort(stu, number);
    print(stu, number);
    free(stu);
    return 0;
}

回答2:

1、结构体指针其实是一个指针,它存储的是指向某个结构体的“地址”,所以结构体指针数组存储的其实是指向一组结构体的“地址”数组,它本身并不包含结构体的具体内容(没有被分配内存)
2、所以当用到他们时,要么重定向,比如:
d=&b; //让d指向b,d存储的是b的地址,这样就能通过d来调用b了
要么用malloc为他们分配内存:
d=(struct h *)malloc(sizeof(struct h));
这样d就指向系统为其分配的一块内存,其内容就是struct h中的东西