前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言结构体数组、指针与函数-学习二十八

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

作者头像
XG.孤梦
发布2022-03-01 14:33:26
1K0
发布2022-03-01 14:33:26
举报
文章被收录于专栏:日志随记

本文最后更新于2022年02月24日,已超过4天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

结构体数组

结构体数组的定义

  • 一个结构体变量只能存放一组有关联的数据,比如一个学生的数据, 如果要存放多个学生的数据,就要使用结构体数组
  • 在声明了结构体类型之后,结构体数组的定义与基本类型数组的定义完全相同。
  • 例如:
代码语言:javascript
复制
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;

结构体数组的初始化

  • 结构体数组和基本类型数组一样可以初始化,只是每个元素的初值是由括起来的一组数据, 初始化的形式是定义数组的同时,在其后面加上“={初值表列}”。
  • 例如:
代码语言:javascript
复制
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个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,进行投票,最后输出各人得票结果。

代码语言:javascript
复制
#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个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

代码语言:javascript
复制
#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值作为表达式的值。
  • 例子
代码语言:javascript
复制
#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个学生的信息,放在结构体数组中,要求全部学生的信息。

代码语言:javascript
复制
#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门课程成绩和平均成绩)。

代码语言:javascript
复制
#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;
    }
}

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);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结构体数组
    • 结构体数组的定义
      • 结构体数组的引用
        • 结构体数组的初始化
        • 结构体指针
          • 指向结构体变量的指针
            • 指向结构体数组的指针
              • 用结构体变量和结构体变量的指针作函数
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档