您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第六章结构体与共用体.
结构体与共用体目录结构体概述结构体变量结构体数组共用体枚举类型typedefC的数据结构如下C数据类型(常量、变量)基本类型构造类型指针类型空类型void定义类型typedef字符类型char枚举类型enum整型实型单精度型float双精度型double数组结构体struct共用体union短整型short长整型long整型int在程序中对用到的所有数据必须指定其数据类型结构/结构体为什么引入结构型数据:例如:一个学生的记录包含:学号、姓名、年龄、住址、成绩。如何用一个简单的形式表示?结构体:是用同一个名字引用的相关变量的集合(聚合体)是用其它不同数据类型的对象构造出来的派生数据类型。注:数组是相同数据类型组成的。结构体类型定义定义的形式struct[结构体名]{类型标识符成员名1;类型标识符成员名2;…………….};合法标识符可省:无名结构体成员类型可以是基本型或构造型struct是关键字,不能省略注:不是变量,而是一种类型,不分配内存空间namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudents1;结构体类型定义描述结构的组织形式,定义类型时不分配内存,当定义变量时分配内存单元结构体定义的说明定义一个结构体类型只是描述了此结构体的组织形式,在编译时并不为其分配存储空间,即仅描述此数据结构的形态或者说模型,故不能对定义的一个结构体类型进行赋值、存取或运算。结构体的成员可以是简单变量、数组、指针、结构体或共用体等。(P119例)结构体类型定义可以放在函数内部,也可以放在函数外部。若放在内部,则只在函数内有效;若放在外部,则从定义点到源文件尾之间的所有函数都有效。结构体成员的名字可以同程序中的其它变量同名,二者不会相混,系统会自动识别它。目录结构体概述结构体变量结构体数组共用体枚举类型typedef结构体变量的定义结构体变量定义的三种方法:1.先定义结构体类型,然后定义变量structstudent{………};structstudentstudent1,student2;(变量表列)同其它变量一样,结构体变量也必须先定义,然后才能引用。2.定义结构体类型的同时定义变量structstudent{………}student1,student2;(变量表列)3.直接声明结构体变量struct{………}student1,student2;(变量表列)不推荐使用一旦定义了一个结构体类型,那么这个结构体类型就是一种数据类型,可以用变量来表示这样类型的数据。就象用一个整型变量表示整型数据。注意:(1)类型与变量是不同的概念;(2)结构体变量的定义一定要在结构体类型定义之后或同时进行;(3)对结构中的成员可以单独使用;(4)成员可以是结构变量;(5)成员名和普通变量可以同名结构体变量的初始化和数组一样,结构体也可以用初始化列表一般格式为:struct结构体类型名结构体变量={初始化值};#includestdio.hstructdate_type{intyear;intmonth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;charaddress[10];};voidmain(){structstud_typestudent1={wang,196103,'m',1978,10,12,98,Xian};structstud_typestudent2={liu,196105,‘f',1980,9,22,88,Benjing};……}说明:(1)初始化数据之间用逗号分隔。(2)初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为0(若成员是指针,则初始化为NULL)。(3)初始化数据的类型要与相应成员变量的类型一致。(4)初始化时只能对整个结构体变量进行,不能对结构体类型中的某个成员进行初始化赋值。结构体变量的引用对结构体变量成员的引用不能对结构体变量整体进行各种运算、赋值或输入输出操作,而只能是对其成员进行此类操作。引用结构体变量成员的一般形式:结构体变量名.成员名其中.是结构体成员运算符,其优先级别最高,结合性是自左至右。由此对结构体成员就完全可以像操作简单变量一样操作它。例如:对上例定义的结构体变量student1或student2,可作如下的操作:赋值操作:student1.name[10]=wang;×student1.name=“wang”;×字符数组不能整体赋值strcpy(student1.name,”wang”);student1.num=196103;student1.sex='m';student1.birthday.year=1978;student1.birthday.month=10;student1.birthday.day=12;student1.score=98;运算操作:sum=student1.score+student2.score;输入输出操作:scanf(“%d%d%d”,&student1.birthday.year,&student1.birthday.month,&student1.birthday.day);例6.1计算某日是该年的第几天。#includestdio.hstructdatetype{intyear;intmonth;intday;};voidmain(){intdays=0,i;intmon_Day[12]={31,28,31,30,31,30,31,31,30,31,30,31};structdatetypedate;//输入部分printf(“请输入年月日(例:2003.10.1)\n);scanf(%d.%d.%d,&date.year,&date.month,&date.day);//计算部分for(i=1;idate.month;i++)//算到指定月份的第一天days=mon_Day[i-1]+days;days=date.day+days;/*计算指定日期,如果月份大于2月,并且是闰年,则要加1天*/if(((date.year%100!=0&&date.year%4==0)||date.year%400==0)&&date.month2)days++;//输出部分printf(“这一天是%d年的第%d天\n,data.year,days);}对结构体变量整体的引用与成员变量不同的是:整体不能参加各种运算、赋值或整体输入输出操作。可以进行的操作有:(1)可以相互赋值,但注意相互赋值的两个结构体变量必须是同一个结构体类型;如:student1=student2;(2)可作为函数的形参、实参或函数返回值(详见下节)结构体变量作为函数参数把结构体传递给函数有三种方式:传递单个成员、整个结构体、传递指向结构体的指针1.传递单个成员用结构变量成员作为实参,此时的结构变量成员与普通变量作为实参一样。(值传递)例如:对于上面定义的结构变量student1有六个成员分别是:num、name[10]、sex、age、score、addr[30]。其中任何一个都可以做实参。print(student1.name);若需要将成员地址传递给函数,则只需在其前加取地址符“&”。func1(student1.name);func2(&student1.num);2.传递整个结构体变量(全体传递)用结构变量作实参,将结构变量所占的内存单元内容全部顺序传递给形参。(值传递)建立一个把数组作为成员变量的结构,即可实现数组的传值调用。由于采用值传递内存开销大、在被调函数中改变的形参值不能返回主调用函数,因此在使用上很不方便。例6.2从键盘输入一名学生信息,包括其姓名、学号、3门课程成绩,要求用print函数完成输出;思考:如何完成对这名学生3门课程成绩的排序?#includestdio.hstructstud_type{charname[10];intnum;floatscore[3];};voidprint(structstud_typestu);voidmain(){structstud_typestu1;printf(请输入姓名、学号、三门成绩\n);scanf(%s%d%f%f%f,stu1.name,&stu1.num,&stu1.score[0],&stu1.score[1],&stu1.score[2]);print(stu1);}voidprint(structstud_typestu){printf(输出姓名、学号、三门成绩为:\n);printf(\n%s%5d%5.2f%5.2f%5.2f\n,stu.name,stu.num,stu.score[0],stu.score[1],stu.score[2]);}对这名学生三门成绩排序,可否作如下设计:#includestdio.hstructstud_type{charname[10];intnum;floatscore[3];};voidsort(structstud_typestu);voidmain(){structstud_typestu1;printf(请输入姓名、学号、三门成绩\n);scanf(%s%d%f%f%f,stu1.name,&stu1.num,&stu1.score[0],&stu1.score[1],&stu1.score[2]);sort(stu1);printf(“排序结果如下\n”);printf(%s%5d%5.2f%5.2f%5.2f\n,stu1.name,stu1.num,stu1.score[0],stu1.score[1],stu1.score[2]);}voidsort(structstud_typestu){inti,k,j,t;for(i=0;i2;i++){k=i;for(j=i+1;j3;j++)if(stu.score[k]stu.score[j])k=j;if(k!=i){t=stu.score[i];stu.score[i]=stu.score[k];stu.score[k]=t;}}}目录结构体概述结构体变量结构体数组共用体枚举类型typedef结构体数组的定义在定义结构体数组时其定义方法与定义结构体变量方法类似,也有三种形式。structdate_type{intyear;intmouth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;charaddress[10];};structstud_typestudent[2];结构体数组的初始化stuctstud_typestudent[2]={{wang,196103,'m',1978,10,12,98,xian},{zhang,196102,'f',1977,1,10,87,“Beijing}};其一般格式是在定义之后紧跟一个用花括号括起来的一组初始数据,为了增强可读性,最好使每一个数组元素的初始数据也用花括弧括起来,以此来区分各个数组元素。结构体数组元素的引用格式:数组名[下标].成员名1.可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或者赋给同一结构体类型的变量;structstud_typestudent[3],student1;student1=student[0];student[0]=student[1];studnet[1]=student1;2.不能把结构体数组元素作为一个整体直接进行输入或输出;而只能以单个成
本文标题:第六章结构体与共用体.
链接地址:https://www.777doc.com/doc-3836239 .html