结构体类型(掌握点):

  • 建立结构体类型
  • 定义结构体类型变量
  • 初始化结构体和引用结构体变量(3种方法,见下)
  • 使用结构体数组
  • 结构体指针(重要)
    1. 指向结构体变量的指针
    2. 指向结构体数组的指针

代码案例

#include<stdio.h>
#include<string.h>//定义结构体struct Student{long num;//学号为整型char name[20];//姓名为字符串char sex;//性别为字符型int age;//年龄为整型float score;//成绩为实型char addr[30];//地址为字符串
};  //注意最后有一个分号int main(){//1.指向结构体变量的指针struct Student stu;struct Student *p; p=&stu;  stu.num=10101; //对结构体的变量成员赋值strcpy(stu.name,"Micheal");//注意:不能写成stu.name="Micheal"; 使用头文件#include<string.h>stu.sex='M';stu.score=89.5;//输出结构体(3种方式)printf("(num)%ld (name)%s (sex)%c (score)%5.1f \n" , stu.num,stu.name,stu.sex,stu.score);printf("(num)%ld (name)%s (sex)%c (score)%5.1f \n" , (*p).num,(*p).name,(*p).sex,(*p).score);printf("(num)%ld (name)%s (sex)%c (score)%5.1f \n\n" , p->num,p->name,p->sex,p->score);//2.指向结构体数组的指针struct Student stu1[3]={{1101,"Martin",'M',23,87.6f,"China"},{1102,"Tom",'M',16,92.3f,"America"},{1103,"Susan",'F',35,78.4f,"India"}};struct Student *p1;for(p1=stu1;p1<stu1+3;p1++){//注意使用方法printf("(num)%ld (name)%s (sex)%c (score)%5.1f \n" , p1->num,p1->name,p1->sex,p1->score);}
}
代码说明:
  1. (*p).num 表示p指向的结构体变量中的成员num。注意: *p 两侧的括号不能省,因为成员运算符 “ . ” 优先于“ * ”运算符,*p.num 就等价于 *(p.num);
  2. 如果p指向一个结构体变量stu,以下3种用法等价:
    ① stu.成员名(如:stu.num);
    ② (*p).成员名(如:(*p).num);
    ③ p->成员名(如:p->num);
  3. 对结构体成员变量:char name[20]; 的操作
    ①如果需要输入结构体变量的值的时候,请注意:
    对stu.name的输入方式为:scanf("%s",stu.name);//而不是scanf("%s",&stu.name);
    原因:name是数组名,本身就代表地址;
    ②如果要对结构体成员变量赋值时,请注意:
    对stu.name的赋值方式为:strcpy(stu.name,“Micheal”);//而不是 stu.name = “Micheal”;且注意添加头文件 #include<string.h>
运行结果

结构体和函数之间的参数使用(重点+难点)

  1. 用结构体变量成员 作实参(例如:stu[1].num):属于“值传递”方式,注意实参和形参的类型保持一致。
  2. 用结构体变量作实参(例如:stu):属于“值传递”方式,形参必须是与实参同类型的结构体变量。
    缺点:①这种传递方式在空间和时间上开销比较大;②在被调用函数期间改变了形参,并不能改变主函数中的实参值。
  3. 用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。
案例

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

程序实现
#include<stdio.h>
#include<string.h>
#define N 3//定义结构体
struct Student{long num;//学号为整型char name[20];//姓名为字符串float score[3];//成绩为实型float  aver;//平均成绩
};  //注意最后有一个分号int main(){//函数声明void input(struct Student stu[]);//输入信息struct Student max(struct Student stu[]);//寻找平均成绩最高void print(struct Student stu);//输出信息struct Student stu[N];//定义结构体数组struct Student *p=stu;//定义结构体指针struct Student max_stu;//定义结构体变量input(p);max_stu=max(p);print(max_stu);return 0;
}void input(struct Student stu[]){int i;printf("请输入各学生的信息(学号、姓名、三门课成绩):\n");for(i=0;i<N;i++){scanf("%ld %s",&stu[i].num,stu[i].name);//注意不能写成&stu[i].name,因为name是数组名,本身就代表地址for(int j=0;j<3;j++){//依次输入3门课的成绩scanf("%f",&stu[i].score[j]);}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;//m用来存放成绩最高的学生在数组中的序号for(i=1;i<N;i++){if(stu[i].aver>stu[m].aver){m=i;}}return stu[m];
}void print(struct Student stu){printf("\n最高学生的成绩为:\n");printf("学号:%ld ,姓名:%s ,三门课成绩:%5.1f、%5.1f、%5.1f ,平均成绩:%6.2f \n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver);
}
代码说明:

以上三个函数的调用情况各不相同:

  • 调用 input 函数时,实参是指针变量p,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。
  • 调用 max 函数时,实参是指针变量p,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。
  • 调用 print 函数时,实参是结构体变量(结构体数组元素),形参是结构体变量,传递的是结构体变量中各成员的值(“值传递”),函数无返回值。
运行结果:

案例2

有n个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘上输入n个学生数据,要求输出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。

程序实现
#include<stdio.h>#define N 3struct Student{long id;char name[10];float score[3];float aver;
};void input(struct Student stu[]);
void func(struct Student stu[],float (*p)[2]);int main(){struct Student stu[N];struct Student *p=stu;float lessons[3][2];//二维数组{{该门课程的平均成绩,最高分学生的序号},{},{}}input(p);func(p,lessons);for(int i=0;i<3;i++){printf("第%d门课程的平均分为:%8.3f ,最高分的学生数据为:\n",i+1,lessons[i][0]);struct Student max_stu=stu[(int)lessons[i][1]];printf("学号:%ld ,姓名:%s ,三门课的成绩:%5.2f、%5.2f、%5.2f ,平均分:%f \n\n",max_stu.id,max_stu.name,max_stu.score[0],max_stu.score[1],max_stu.score[2],max_stu.aver);}return 0;
}void input(struct Student stu[]){int i;printf("请输入学生信息(学号、姓名、3门课的成绩):\n");for(i=0;i<N;i++){scanf("%ld %s",&stu[i].id,stu[i].name);for(int j=0;j<3;j++)scanf("%f",&stu[i].score[j]);stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;}
}void func(struct Student stu[],float (*p)[2]){int i,j,max_student;//max_student用来存放成绩最高的学生在数组中的序号for(i=0;i<3;i++){//3门课程max_student=0;*(*(p+i)+0)=0;//注意:初始化语句不能少;否则结果出于意料(本人在编程时,因为这个错误,耗了很久)for(j=0;j<N;j++){//N个学生*(*(p+i)+0)+=stu[j].score[i];//累加所有学生的该课程成绩if(stu[j].score[i]>stu[max_student].score[i])max_student=j;}*(*(p+i)+0)/=N;*(*(p+i)+1)=(float)max_student;}
}
代码说明:
  • 第46行代码: *( *(p+i)+0)=0; 的初始化语句不能少,否则结果可能会出乎意料。
运行结果:

C程序设计--结构体(结构体和函数之间的参数使用)相关推荐

  1. c语言程序设计实验8,C语言程序设计实验八结构体.doc

    C语言程序设计实验八结构体 C语言程序设计实验八:结构体 请求用户输入若干个学生的基本情况,其中包括每位学生的学号.姓名和两门课(C语言.数学)的成绩.然后用下面的格式输出学生的成绩列表. 格式描述如 ...

  2. C语言程序设计 细节总结(第9章 结构体共用体枚举)

    第9章 结构体.共用体.枚举 9.1 结构体 1.对于同类型结构体变量之间可以整体一次赋值 9.2 指向结构体的指针 9.2.1结构体变量的指针 1.定义格式:struct 结构体名 *结构体指针变量 ...

  3. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  4. C语言之在结构体里面放很多函数指针

    1 原因 看了open ssl代码里面很多在结构体里面放很多函数指针,然后再来调用,这样比较规范和统一 2 代码实现 #include <stdio.h> #include <ass ...

  5. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  6. C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

    文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...

  7. C 语言结构体数组指针以及函数

    结构体数组指针 指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址. 设 ps 为指向结构体数组的指针变量,则 ps 也指向该结构体数组的第 0个元素,ps+1 指向第一个元素,ps+ ...

  8. Linux学习-文件IOA1——用结构体和文件操作函数实现文件的拷贝

    Linux学习-文件IOA1--用结构体和文件操作函数实现文件的拷贝 其实我们不必选用结构体去实现模仿拷贝功能的,但是为了锻炼我们的思维以及对结构体.文件操作函数的使用,所以我们就这样来折腾自己. 学 ...

  9. 【C 语言】结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

    文章目录 一.结构体作为函数参数 二.结构体指针作为函数参数 三.完整代码示例 一.结构体作为函数参数 结构体变量 作为函数形参 , 在函数中 , 只能访问 该函数形参 , 无法修改 结构体内存 的值 ...

  10. C++结构体 结构体定义和使用、结构体数组、结构体指针、结构体嵌套结构体、结构体做函数参数

    C++结构体 第二章 C++结构体 1.结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体 ...

最新文章

  1. C++ 通过模版工厂实现 简单反射机制
  2. CF498C Array and Operations(数论 + 最大流)
  3. 数据结构源码笔记(C语言):Huffman树字符编码
  4. boost::math模块两个 Lambert W 函数的最基本调用示例
  5. 怎样加速微软商店服务器,windows10系统如何加快应用商店打开速度【图文教程】...
  6. 从零开始刷Leetcode——动态规划(70.198.303)
  7. `ifdef、`else、`endif 用法
  8. spring boot默认扫描的路径
  9. 《新概念模拟电路》系列电子书下载
  10. Ubuntu 的护眼软件 :RedShift
  11. 华为设备配置VRRP,实现设备网关冗余备份
  12. android毕业论文结论,毕业论文经典结束语
  13. 人的一生该怎样度过?
  14. 构建股票交易平台专业术语
  15. 新增诊所19804家 | 私营诊所要如何主动?才能被患者选择
  16. IDEA软件常见的使用方法
  17. freemaker导出excel文件使用Excel打不开
  18. 优麒麟mysql_Ubuntu kylin优麒麟下配置Hive环境
  19. 程序员学英语——In November the English learning summary
  20. 计算机视觉中的边缘检测

热门文章

  1. spring aop advice
  2. ERROR 1045 (28000): Access denied for user 'root'@'localhost' 的解决方法
  3. 在Vmware中安装archlinux(2008.3core)的流程与心得
  4. 一个本科毕业生的Java学习之路
  5. 9、两个栈实现队列(Python)
  6. QT正则表达式截取字符串末尾数字
  7. [Golang]解决Map的并发性问题:sync.Map
  8. php中文件读写总结,PHP读取文件_2014.5.26的总结
  9. php有的图片显示不出来,图片显示不出来,但是数据库里有显示
  10. VUE项目导入bootstrap