您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言程序设计-结构体与共用体
第12章结构体与共用体程序设计语言2本章主要内容结构体数据类型,共用体数据类型、枚举数据类型、定义数据类型的别名结构体变量、结构体数组、结构体指针的定义和初始化结构体成员的引用、成员选择运算符、指向运算符向函数传递结构体变量、结构体数组、结构体指针动态数据结构、动态链表3C数据类型指针类型空类型void定义类型typedef构造类型枚举类型enum数组结构体struct共用体union基本类型字符类型char实型单精度型float双精度型double整型短整型short长整型long整型int只能定义单一的数据类型,反映事物单一属性如定义学生成绩:floatscore;能定义复杂的数据类型,反映事物多个属性存放相同数据类型的一组数据,如:floatscore[30];12.1从基本数据类型到抽象数据类型4412.1从基本数据类型到抽象数据类型用户自己构造数据类型——复合数据类型–由基本数据类型迭代派生而来,表示复杂的数据对象典型的代表就是“结构体”抽象数据类型(AbstractDataType,ADT)–在复合数据类型基础上增加了对数据的操作抽象数据类型进而进化为“类(Class)”–这是一个跨时代的进步–Class是Object-Oriented的一个重要概念512.2.1问题的提出12.2.2结构体类型(结构体模板)定义12.2.3结构体变量的定义12.2.4结构体变量的初始化12.2.5结构体变量的引用12.2.6结构体数组12.2.7结构体指针12.2.8结构体作为函数参数12.2结构体612.2.1问题的提出一个学生的信息有学号、姓名、性别、年龄、成绩等一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等如何描述和管理这些类型不同的相关数据?(使用二维数组行吗)问题:学号姓名性别年龄成绩1001张三男19901002李四女21871003王五男1896……………712.2.1问题的提出解决方案:1)独立的变量表示:nonamesexagescore数据项之间无关联数据覆盖812.2.1问题的提出2)使用一维数组张三李四王五赵六麻七FMFMF100110021003100410051921182019agenosexname分配内存不集中,寻址效率不高;对数组赋初值时,易发生错位;结构显得零散,不易管理;90879687.576score912.2.1问题的提出解决方案:C语言引入了称为结构体的数据存储方式“结构体”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构体的成员。把关系紧密且逻辑相关的多种不同类型的变量,组织到统一的名字之下,占用相邻的一段内存单元nonamesexagescore结构体变量表示:把不同类型的数据组合成一个整体数据项为一个整体1012.2.2结构体类型定义struct[结构体名]{数据类型名1成员名1;数据类型名2成员名2;……数据类型名n成员名n;};struct是关键字,不能省略合法标识符可省:无名结构体成员类型可以是基本型或构造型以分号;结尾structStudent{charno[9];//学号charname[20];//姓名charsex;//性别unsignedintage;//年龄floatscore;//成绩};structDate{shortyear;//年shortmonth;//月shortday;//日};1112.2.2结构体类型定义structStudent{charno[9];//学号charname[20];//姓名charsex;//性别shortintage;//年龄floatscore;//成绩};namenosexagescore9字节2字节20字节1字节4字节……..结构体类型定义描述结构的组织形式注意:结构体类型只是用户自定义的一种数据类型,用来定义描述结构的组织形式,不分配内存,只有用它来定义某个变量时,才会为该变量分配结构类型所需要大小的内存单元。12在结构体中数据类型相同的成员,既可逐个、逐行分别定义,也可合并成一行定义,就象一次定义多个变量一样。structStudent_Info{charno[9];//学号charname[20];//姓名charsex;//性别unsignedintage;//年龄unsignedintclassno;//班级floatgrade;//成绩};structStudent_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;};12.2.2结构体类型定义1312.2.3结构体变量定义struct结构体类型名{数据类型名1成员名1;……数据类型名n成员名n;};struct结构体类型名变量列表;先定义结构类型,再定义结构变量structStudent{charno[9];charname[20];charsex;unsignedintage;floatscore;};structStudentstu1,stu2;定义一个类型为structstudent结构体的变量,将会为该变量分配内存,大小是等于其所有成员变量的大小之和。sizeof(structStudent)1412.2.3结构体变量定义定义结构体类型的同时定义结构体变量struct[结构体类型名]{数据类型名1成员名1;……数据类型名n成员名n;}变量名列表;structStudent{charno[9];charname[20];charsex;unsignedintage;floatscore;}stu1,stu2;struct{charno[9];charname[20];charsex;unsignedintage;floatscore;}stu1,stu2;或无名结构体定义1512.2.3结构体变量定义成员可以是结构体,结构体可以嵌套structdate{intmonth;intday;intyear;};structstudent{intno;charname[20];structdatebirthday;}stu;structstudent{intno;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu;nonamebirthdaymonthdayyear1612.2.4结构体变量的初始化定义结构体变量时给结构体成员赋值struct结构体类型名初值表{……};struct结构体类型名变量名={成员1的值,…,成员n的值};注意:赋初值时,{}中间的数据顺序必须与结构体成员的定义顺序一致,否则就会出现混乱。structStudentstu={“09122325,YangFan,'M',19,90};nonamesexagescore√structStudentstu={19,YangFan,'M',“09122325,90};×1712.2.4结构体变量的初始化定义结构体变量时给结构体成员赋值structdate{intyear,month,day;};structStu_Info{charno[9];//学号charname[20];//姓名charsex;//性别structdatebirthday;//生日floatscore;//成绩};structStu_Infostu={20020306,ZhangMing,'M',{1986,12,10},90};1812.2.5结构体变量的引用引用规则:不能整体引用,只能引用变量的成员引用方式:结构体变量名.成员名成员(分量)运算符结合性:从左向右structstudent{charno[9];charname[20];charsex;unsignedintage;floatscore;}stu1,stu2;if(stu1==stu2)……..()stu1.score=85.5;stu1.age=stu2.age;strcpy(stu1.no,“09122414”;)1912.2.5结构体变量的引用可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用structstudent{intno;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;stu2=stu1;()stu1.birthday.month=12;结构体变量名.成员名.子成员名……最低级子成员名2012.2.5结构体变量的赋值strcpy(stu1.no,stu.no);strcpy(stu1.name,stu.name);stu1.sex=stu.sex;stu1.age=stu.age;stu1.score=stu.score;structStudentstu;strcpy(stu.no,“09122424);strcpy(stu.name,“XuTeng);stu.sex='M';stu.age=21;stu.score=90;structStudentstu1;stu1=stu;如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员逐一赋值,或者用已赋值的同类型的结构体变量对它赋值逐一赋值利用已赋值的结构体变量赋值2112.2.5结构体变量应用举例【例】计算某个学生5门课的平均成绩,最高分和最低分#includestdio.hstructStudent{floatscore[5];floatavescore,maxscore,minscore;};voidmain(){inti;structStudentm;printf(inputthescoreoffivecourse:\n);for(i=0;i5;i++)//输入5门课的成绩scanf(%f,&m.score[i]);m.avescore=0;m.maxscore=m.score[0];m.minscore=m.score[0];for(i=0;i5;i++){m.avescore+=m.score[i];if(m.score[i]m.maxscore)m.maxscore=m.score[i];if(m.score[i]m.minscore)m.minscore=m.score[i];}m.avescore/=5;printf(“avescore=%4.1f,maxscore=%4.1f,minscore=%5.1f\n,m.avescore,m.maxscore,m.minscore);}运行结果(设5门课的成绩为:7580869068):avescore=79.8maxscore=90.0minscore=68.02212.2.6结构体数组元素为结构体类型的数组称为结构体数组。在实际应用中,经常用结构体数组来表示具有相同数据结构体的一个群体。例如一个班的学员档案,一个公司的职工档案等。结构体数组的定义形式一:structStudent{charno[9],name[20],sex;unsignedintage;floatscore;};structStudentstu[10];形式二:structStudent{charno[9],name[20],sex;unsignedintage;floatscore;}stu[10];形式三:struct{charno[9],name[20],sex;unsignedintage;floatscore;}stu[10];2312.2.6结构体数组与二维表的对应关系结构体数组就相当于一张二维表,表的框架对应的就是某种结构体类型,表中的每一列对应该结构体的成员,表中每一行信息对应该结构体数组元素各成员的具体值,表中的行数对应结构体数组的大小。nonamesexagescore…………………………结构体类型Studentstu[0]stu[1]
本文标题:C语言程序设计-结构体与共用体
链接地址:https://www.777doc.com/doc-4749257 .html