TypechoJoeTheme

日志随记

统计
登录
用户名
密码

扫码登录
/
注册
用户名

此用户名将作为登录时所用的账号

邮箱

XG.孤梦

随风而动,随遇而安......

C语言结构体数组、指针与函数-学习二十八

XG.孤梦博 主大佬
2022-02-23
/
0 评论
/
1,982 阅读
/
1337 个字
/
百度已收录
02/23
本文最后更新于 2022年08月13日,已超过 823天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

结构体数组

结构体数组的定义

  • 一个结构体变量只能存放一组有关联的数据,比如一个学生的数据,
    如果要存放多个学生的数据,就要使用结构体数组
  • 在声明了结构体类型之后,结构体数组的定义与基本类型数组的定义完全相同。
  • 例如:
struct student{
    long int no; 
    char name[20];
    char sex;
    float score;
    };

struct student stu[3];
  • 定义了struct student类型的数组,数组名为stu,包含3个数组元素,每个数组元素都是一个struct student类型的结构体变量,分别是stu[0].stu[1].stu[2]。

结构体数组的引用

  • 产表示下标为i的结构体数组元素的成员no的值

    • stu[i].no;
  • 产表示下标为i的结构体数组元素的成员name的首地址(name为char数组)

    • stu[i].name;
  • 表示下标为i+1的结构体数组元素的成员sex值

    • stu[i+ 1].sex;
  • 产表示下标为i- 1的结构体数组元素的成员score的地址

    • &stu[i- 1].score;

结构体数组的初始化

  • 结构体数组和基本类型数组一样可以初始化,只是每个元素的初值是由括起来的一组数据,
    初始化的形式是定义数组的同时,在其后面加上“={初值表列}”。
  • 例如:
struct student{
    int num;
    char name[20];
    char sex;
    int age;
}
struct student stu[3]={
    {100,"Wang Lin",M',20},
    {101,"Li Gang", 'M',19},
    {110,"Liu Yan", F,19}
    };
  • 例子

有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,进行投票,最后输出各人得票结果。

#include <stdio.h>
#include <string.h>

void main() {

    struct Person {
        char name[20];
        int count;
    }leader[3] = { {"Zhangsan",0},{"Lisi",0},{"Wangwu",0} };

    int i, j;
    char leader_name[20];
    printf("请输入支持的候选人名字:\n");
    for (i = 0; i < 10; i++) {
        scanf_s("%s", leader_name,20);
        for (j = 0; j < 3; j++) {
                           // strcmp函数比较字符串是否相同,相同就返回 0
            if (strcmp(leader_name, leader[j].name) == 0) {
                leader[j].count++;
            }
        }
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        printf("%s:%d\n", leader[i].name, leader[i].count);
    }
}

有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

#include <stdio.h>

struct Student {
    int no;
    char name[20];
    float score;
};

void main() {
    struct Student stu[5] = {
        {10001,"Zhangsan",98.5},
        {10002,"Lisi",80.5},
        {10003,"Wangwu",80.5},
        {10004,"Zhaoliu",100},
        {10005,"Xiqi",59}
    };
    struct Student temp;

        // 定义常量
        const int n = 5; 
        int i, j, k;

        printf("成绩排行榜\n");
        for (i = 0; i < n; i++) {
            for (j = i + 1; j < n; j++) {
                if (stu[j].score>stu[i].score) {
                    temp = stu[j];
                    stu[j] = stu[i];
                    stu[i] = temp;
                }    
            }
        }
        for (i = 0; i < n; i++) {
            printf("%d %10s %.2f\n",stu[i].no,stu[i].name,stu[i].score);
        }
}


结构体指针

指向结构体变量的指针

  • 指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素
  • 指针变量的基类型必须与结构体变量的类型相同
  • 定义格式:

    • struct 结构体名 *结构体指针变量名
  • 例如:

    • struct Student stu;
      struct Student *pt;
    • 赋值
    • pt = &stu;
  • 1.结构体类型只能表示一个结构形式,编译程序并不对它分配内存单元
  • 2.定义指向结构体类型的指针变量并确定它的指向后,就可以用结构体指针变量访问所指向的结构体的成员
  • 指针变量访问结构体变量的成员有以下几种形式

    • (1)(*结构体指针变量).成员名
      括号不能省略,因为 “.” 运算符优先级高于 “*” 的

      • 例如:(*sp).name
    • (2)结构体指针变量 -> 成员名
      C语言提供了一种简便的结构体指针变量取成员运算 “->”称为指向成员运算符(或箭头运算符),和 “.” 优先级差不多,结合性都是从左往右。

      • 例如: sp -> name
    • (&结构体变量) -> 成员名

      • 例如:(&stu) -> namae
  • 当用结构体变量访问结构体数据成员时用 “.” 运算符比较方便;
    当用指针访问结构体成员时用 “->” 运算符比较方便。
  • 例如
  • sp -> no
    sp指向结构体变量stu, sp -> no 等价于 stu.no
  • sp -> no++
    指向运算符 “->” 高于 “++” ,等价于 (sp -> no)++ 。先引用sp -> no值,即 stu.no 作为表达式的值;再使其值加1,即stu.no值加1。
  • ++sp -> no
    指向运算符 “->” 高于 “++” ,等价于 ++(sp -> no) 即先使 sp->no 值加1,即 stu.no 值加1;然后引用修改之后的 sp -> no值作为表达式的值。
  • 例子
#include <stdio.h>

struct Student {
    int no;
    char name[20];
    float score;
};

void main() {
    struct Student *p;
    struct Student stu = {10001,"Zhangsan",98.5};
    p = &stu;
    printf("学号:%d\n姓名:%s\n成绩:%.2f\n",(*p).no,p -> name,(&stu) -> score);
}


指向结构体数组的指针

  • 可以用指针变量指向结构体数组的元素。
  • 例如:

有3个学生的信息,放在结构体数组中,要求全部学生的信息。

#include <stdio.h>

struct Student {
    int no;
    char name[20];
    float score;
};

void main() {
    struct Student *p;
    struct Student stu[5] = {
        {10001,"Zhangsan",98.5},
        {10002,"Lisi",80.5},
        {10003,"Wangwu",80.5},
        {10004,"Zhaoliu",100},
        {10005,"Xiqi",59}
    };
    
    for (p = stu; p<stu+5; p++) {
        printf("%d %10s %.2f\n",p->no, p->name, p->score);
    }
}


用结构体变量和结构体变量的指针作函数

  • 结构体作为函数参数

    • 对结构体数据操作时,常常需要将结构体变量的成员、结构体变量、结构体数组名或结构体指针作为参数
      传递给另一个函数。
  • 1.用结构体变量的成员作参数

    • 用法和用普通变量作实参是一样的,属于“值传递”方式。
    • 应当注意实参与形参的类型保持一致。
    • 例如:

      • stu[1].numstu[2].name 作函数实参,将实参值传给形参。
  • 2.用结构体变量作实参

    • 用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参。
    • 形参也必须是同类型的结构体变量。
    • 在函数调用期间形参也要占用内存单元,这种传递方式在空间和时间上开销较大。
    • 在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数
  • 3.用指向结构体变量(或数组元素)的指针作实参

    • 用指向结构体变量(或数组元素)的指针作实参时,将结构体变量(或数组元素)的地址传递给形参
  • 结构体与函数之间的关系主要是:

    • 1.结构体作为函数的参数
    • 2.结构体可以作为函数的返回值
  • 例子:

有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。

#include <stdio.h>
#define N 3

struct Student {
    int no;
    char name[20];
    float score[3];
    float aver;
};

void main() {
    void input(struct Student stu[]);
    struct Student max(struct Student stu[]);
    void print(struct Student stu);
    struct Student *p;
    struct Student stu[N];
    p = stu;
    input(p);
    print(max(p));
}

void input(struct Student stu[]) {
    int i;
    printf("请输入各学生信息:\n");
    for (i = 0; i < N; i++) {
        scanf_s("%d %s %f %f %f",
            &stu[i].no, stu[i].name,20, &stu[i].score[0], 
            &stu[i].score[1], &stu[i].score[2]);
        stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
    }
}

struct Student max(struct Student stu[]) {
    int i,m=0;
    int temp;
    for (i = 0; i < N; i++) {
        if (stu[i].aver > stu[m].aver) {
            m = i;
        }
    }
    return stu[m];
}

void print(struct Student stud) {
    printf("学号:%d\n姓名:%s\n三门成绩:%.2f %.2f %.2f\n平均成绩:%.2f\n",
        stud.no, stud.name, stud.score[0], stud.score[1], stud.score[2], stud.aver);
}


学习笔记C语言
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

日志随记

本文链接:

http://www.xggm.top/archives/694.html(转载时请注明本文出处及文章链接)

评论 (0)
 
登录
X
用户名
密码