版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
广西大学《C语言程序设计》单元9结构体和共用体E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410摘要9.1结构体类型9.1.1结构体类型的定义9.1.2结构体变量的定义9.1.3结构体变量的初始化9.1.4结构体变量的引用9.2结构体数组9.3结构体指针9.4结构体与函数9.5链表9.5.1链表的概念9.5.2链表的实现9.5.3链表的操作9.6构造数据类型-共用体9.6.1共用体类型的定义9.6.2共用体变量的定义9.6.3共用体变量的初始化和引用实例分析与实现E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1结构体类型9.1.1结构体类型的定义E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410学生:学号 intsno;姓名 charname[20];班级 charclassname[20];课程成绩 intgrade[3];将多个不同类型的数据组成一个“整体”E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.1结构体类型的定义struct结构体类型名称{
数据类型成员名1;
数据类型成员名2; …
数据类型成员名n;};【例】structstudent{ intsno; //学号 charname[20]; //姓名 charclassname[20];//班级 intgrade[3];//成绩};E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.1结构体类型的定义
类型定义C语言允许用户使用typedef语句定义新的数据类型名代替已有的数据类型名。类型定义的一般形式为:typedef类型名新类型名【例】typedefstructstudent{ intsno; charname[20]; charclassname[20]; intgrade[3]}STU;其中,STU就是新类型名。使用typedef只是定义了一个新的类型名称,代替已有的类型名,并没有建立一个新的数据类型。E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1结构体类型9.1.2结构体变量的定义E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.2结构体变量的定义结构体类型变量:structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};structstudentstu1;基本数据类型变量 int x; float y; char c;数据类型名变量名数据类型名变量名E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.2结构体变量的定义2.在定义结构体类型的同时定义结构体变量structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};stu1;1.先定义结构体类型,再定义结构体变量structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};structstudentstu1;3.直接定义结构体变量struct{ intsno; charname[20];charclassname[20]; intgrade[3];};stu1;E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.2结构体变量的定义structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};stu1;
结构体变量定义后,编译器就会为其分配内存。它所占用的实际字节数,就是其各个“成员”所占用字节数的总和。本例中变量stu1中各成员所占用内存:E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1结构体类型9.1.3结构体变量的初始化E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.3结构体变量的初始化在定义结构体类型和结构体变量的同时,对结构体变量初始化。【例】structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3]}stu1{201601,"李磊","软件16级1班",{90,85,80}};E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1结构体类型9.1.4结构体变量的引用E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.4结构体变量的引用如何引用结构体变量中的一个成员,其语法结构是:结构体变量名.成员名【例】stu1.sno=20160101;="李磊";stu1.classname="软件16级1班";stu1.grade[0]=90;stu1.grade[1]=85;stu1.grade[2]=80;“.”是一个运算符,表示对结构体变量的成员进行访问E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.4结构体变量的引用【例】要求通过键盘输入一个学生信息,并且输出这个学生的所有信息。
分析:1、定义结构体类型student描述学生信息。其成员包括学号、姓名、班级、三门课程成绩。2、通过键盘输入每个成员的数据。E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.1.4结构体变量的引用【例】从键盘输入学生信息,计算该学生的成绩平均分,并输出该学生的信息。
分析:1、定义结构体类型student描述学生信息。2、学生的成绩是该结构体类型中的一个成员,使用数组类型存储数据,通过遍历数组中的数组元素,经过累加求和,就可以计算成绩的平均分。E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.2结构体数组E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410structstudent{ intsno; charname[20]; charclassname[20]; doublegrade[3]};structstudentstu;如何描述30个学生信息?E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.2结构体数组【例】structstudent{ intsno; charname[20]; charclassname[20]; doublegrade[3]};structstudentstu[30];E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.2结构体数组【例】要求通过键盘输入两个学生信息,并且输出这两个学生的所有信息。分析:1、定义一个包含2个元素的数组,数组元素的类型是结构体类型。2、使用循环结构遍历访问数组元素。E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.3结构体指针E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.3结构体指针【例】structstudent{ intsno; charname[20]; charclassname[20]; doublegrade[3]};structstudents={201601,"李磊","软件16级1班",{90,85,80}};;structstudent*p;p=&s;E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.3结构体指针*(结构体指针变量).成员名(*p).sno=20160101;(*p).name="李磊";(*p).grade[0]=90;p->.sno=20160101;p->.name="李磊";p->.grade[0]=90;结构体指针变量->.成员名E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410【例】要求通过键盘输入一个学生信息,并且输出这个学生的所有信息。(用指针变量引用结构体变量的成员。)9.3结构体指针E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.4结构体与函数E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.4结构体与函数
结构体与函数的关系主要分为三种:结构体变量作为函数参数结构体指针作为函数参数函数的返回值是结构体类型。E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410#include<stdio.h>structstudent{ intsno; charname[20]; doublegrade[3];};voidshowStuInfo(structstudentstu){ printf("学号:%d\n",stu.sno); printf("姓名:%s\n",); printf("课程1:%lf\n",stu.grade[0]); printf("课程2:%lf\n",stu.grade[1]); printf("课程3:%lf\n",stu.grade[2]);}intmain(){ structstudentstu1={20160101,"李磊",{90,85,80}};showStuInfo(stu1); return0;}值传递E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410#include<stdio.h>structstudent{ intsno; charname[20]; doublegrade[3];};voidshowStuInfo(structstudent*p)//结构体指针作函数参数{ printf("学号:%d\n",(*p).sno); printf("姓名:%s\n",(*p).name); printf("课程1:%lf\n",(*p).grade[0]); printf("课程2:%lf\n",(*p).grade[1]); printf("课程3:%lf\n",(*p).grade[2]);}intmain(){ structstudentstu1={20160101,"李磊",{90,85,80}};showStuInfo(&stu1); return0;}地址传递E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410函数的参数是结构体变量
值传递函数的参数是结构体指针
地址传递E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.5链表E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410头指针:存储的是第一个结点的首地址。结点:链表中的每一个元素。
数据域:存储用户需要的数据
指针域:存储下一个结点的地址9.5.1链表的概念E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410链表
在执行过程中根据需要动态申请空间,结点的个数可以根据需要增加或减少。
占用不连续的存储空间。数组
定义时必须指定数组长度,所占用的内存空间大小固定。
占用连续的存储空间。9.5.1链表的概念E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410结点的定义structnode{ intdata;
structnode*next;};9.5.2链表的实现E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4101、初始化链表2、在尾结点后插入新结点9.5.2链表的实现E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410structnode*h,*s;h=NULL;//建立“空”链表s=(structnode*)malloc(sizeof(structnode));//建立首结点s->next=NULL;h=s; 1、初始化链表9.5.2链表的实现E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410p=(structnode*)malloc(sizeof(structnode));p->data=1; p->next=NULL;s->next=p;s=p;2、在尾结点后插入新结点9.5.2链表的实现E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B410p=h->next;//指针指向第一个结点while(p!=NULL){printf("%d\n",p->data);p=p->next;//指针指向下一个结点} 9.5.3链表的操作E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.6共用体类型E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.6.1共用体类型的定义union结构体类型名称{
数据类型成员名1;
数据类型成员名2; …
数据类型成员名n;};【例】uniondata{ intx; doubley; charz;};E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.6.2共用体变量的定义共用体类型变量:uniondata{ intx; doubley; charz;};uniondatad1;数据类型名变量名【例】#include<stdio.h>uniondata{ intx; doubley; charz;};intmain(){ uniondatad1; printf("%d\n",sizeof(d1)); return0;}E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.6.2共用体变量的定义【例】#include<stdio.h>uniondata{ intx; doubley; charz;};intmain(){ uniondatad1; printf("%d\n",sizeof(d1)); return0;}编译器为共用体变量分配空间是是按照其成员中字节数最大的数目分配E6636B02012BD195C019CE06C16E30A4CB3D0AEC2711A616D0819A1A3DE7F8F48FF07703BC41BA966B4BDCF0472B73A72FC0F2BE2AA533FE6902217157F715ADBF2DB6715F2B3FBA7AC24F6B4109.6.3共用体变量的初始化
在定义共用体变量的同时,只能对其中一个成员进行初始化操作,这与它的内存分配方式是对应的。【例】uniondata{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026秋统编版小学道德与法治六年级上册各单元综合测试卷(附期中、末测试卷)(含答案)
- 2025青海普法考试题库及答案
- 2026年中国石油国际事业有限公司人员招聘笔试备考题库及详细答案解析
- 2026年北京控股集团有限公司人员招聘考试备考试题及详细答案解析
- 2026安全考试题库及答案
- 2026年宁波市轨道交通集团有限公司人员招聘考试备考试题及详细答案解析
- 2026年中国电信四川分公司人员招聘考试参考试题及详细答案解析
- 2026年(完整版)新版保安员考试试题含完整附答案
- 2026年8年级生物遗传题库答案
- 2026年【上海市安全员-C3证(专职安全员-综合类)】模拟考试题及答案
- 塔吊安拆工程监理实施细则
- 2026年银行客户经理等级考试必考题库及答案
- T∕CSICE 061-2026 混合动力总成耐久性试验方法
- 初中物理八年级下册《摩擦力》教学设计
- 数学五上综合实践《小小设计师》大单元教学设计(北师大2027新教材)
- 2026年湖南中考语文试卷及答案解析
- (2026年版)中国有肾脏意义的单克隆免疫球蛋白血症诊治专家共识课件
- 家用电器产品检测合同协议
- 消防控制室值班记录表
- SYT 6649-2025《油气管道管体缺陷修复技术规范》
- 2026年高考历史总复习(全国):专题训练01中国古代史部分(选择题必练100题)(原卷版)
评论
0/150
提交评论