您好,欢迎访问三七文档
第十章大连理工大学本章要点•掌握结构类型数据的定义方法和引用方法;•了解共用体和枚举类型数据的定义方法和引用方法。10.1结构体类型如果将这些属性分别定义为互相独立的简单变量,则难以反映相互间的内在联系(同一个学生的属性)可采用结构体数据结构描述上述信息,将不同类型的数据组合成一个有机的整体,这些数据是相互联系的。问题:结构是逻辑上相互联系的一组分量的集合。结构中的分量可以是不同类型的数据,结构中的分量称为结构的成员一个学生有学号/姓名/性别/年龄/地址等属性在使用结构之前,首先要对结构的组成进行描述,称为结构的定义。结构定义说明了该结构的组成成员,以及每个成员的类型。numnamesexageaddr10010LiminM18Dalian10.1.1结构体类型的定义例:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};•定义一个结构体类型的一般形式为:struct结构体类型名{成员表列};对各成员都要进行类型说明;成员名定名规则与变量名同。10.1.2结构体变量的定义方法一:先定义结构体类型再定义变量名定义studet1和sudent2为structstudent型变量structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstudent1,student2;方法二:在定义类型的同时定义变量,如:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}student1,student2;一般形式是:struct结构体名{成员表列}变量名表列;方法三:直接定义结构类型变量。其一般形式是:struct{成员表列}变量名表列;此时,不出现结构体名•可用符号常量代表一个结构体类型,如:#defineSTUDENTstructstudentSTUDENT{intnum;charname[20];charsex;intage;charaddr[30];};这样,可直接用STUDENT定义变量,如:STUDENTstudent1,student2;此时,不必再写关键字struct几点说明:1.类型与变量是不同概念,不要混淆;2.结构体中的成员,可以单独使用,其作用与地位相当于普通变量;3.成员也可以是一个结构体变量;例如:structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];intage;structdatebirthday;}student1,student2;4.成员名可以与程序中的变量名相同,二者不代表同一对象。10.1.3结构体变量的引用规则:1.不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出(引用形式为:结构体变量名.成员名)。printf(………,student1);printf(%d,student1.num);输出10010错!正确!2.若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。如:student1.birthday.year(接上片)3.对成员变量可以象普通变量一样进行各种运算,如:sumage=student1.age+student2.age;4.可以引用成员的地址,也可以引用结构体变量的地址,如scanf(%d,&student1.num);printf(%o,&student1);scanf(%d,%s,%c,%d,%s,&student1);错!输入student1.num的值输出student1的首地址10.1.4结构体变量的初始化structstudent{longintnum;charname[20];charsex;charaddr[20];}a={9801,Wanghong,’W’,2LinggongRoad};main(){printf(No.:%ld\nname:%s\nsex:%c\naddress:\%s\n,a.num,a.name,a.sex,a.addr);}运行结果为:No.:9801name:Wanghongsex:Waddress:2LinggongRoad10.2结构体数组在结构体中使用数组类型作为结构的一个成员;用结构体类型作为数组元素的基类型构成数组。结构与数组的关系例:structstudent{intnum;charname[14];charsex;intade;charadd[20];}s[96];96个元素都具有结构数据类型numnamesexageaddr10010LiminM18Dalian•结构体数组是一个数组,数组中的每一个元素都是结构类型。•说明结构数组的方法:先定义一个结构,再用结构类型说明一个数组变量。例:为记录100个人的基本情况,说明一个有100个元素的数组。数组的基类型为结构体structperson{charname[30];charsex;structdatebirthday}man[100];10.2.1结构体数组的定义man就是有100个元素的结构数组,数组的每个元素为person结构类型。structdate{intmonth;intday;intyear;};例如:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu[3];structstudent{intnum;…}stu[3];或struct{intnum;…}stu[3];structstudent{intnum;…}structstudentstu[3];10.2.2结构体数组的引用访问结构体数组中的具体元素,必须遵守数组使用的规定——按下标进行访问。要访问结构体数组中某个具体元素下的成员,又要遵守有关访问结构成员的规定使用“.”访问运算符和成员名例:为记录100个人的基本情况,说明一个有100个元素的数组。数组的基类型为结构体structperson{charname[30];charsex;structdatebirthday}man[100];structdate{intmonth;intday;intyear;};strcpy(man[3].name,Fangjin);man[3].sex='M';man[3].birthday.year=1963;man[3].birthday.month=9;man[3].birthday.day=13;例如:要将数组man中的3号元素赋值为:Fangjin,'M',1963,9,13使用下列语句:结构数组存放在连续的内存区域中,所占内存大小为结构类型的大小乘以数组元素的数量。例如TC环境下:structpersonman[100]:37*100=3700字节301222301222301222......nsymdnsymdnsymdman[0]man[1]man[99]将Fangjin改为Fangjun:man[3].name[5]='u';/*为数组中元素的数组成员中的一个字符赋值*/为数组中一个元素的一个成员赋值10.2.3结构体数组的初始化structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu[3]={{111,Li,'M',18,Dalian},{…},{…}};结构体数组的初始化的一般形式是在定义数组后面加上:={初值表列};也可采用:structstudent{intnum;…};structstudentstu[]={{…},{…},{…}};#includestring.hstructperson{charname[20];intcount;}leader[3]={Li,0,zhang,0,Liu,0};main(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(%s,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(%5s:%d\n,leader[i].name,leader[i].count);}例:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。10.3结构体指针变量结构体变量的指针:是该结构体变量所占居的内存段的起始地址。例如:main(){structstudent{longintnum;charname[20];charsex;};structstudentstu;structstudent*p;p=&stu;stu.num=9901;strcpy(stu.name,LiMin);stu.sex='W';printf(No.:%ld\nname%s\nsex:%c\n,stu.num,stu.name,stu.sex);printf(\nNo.:%ld\nname%s\nsex:%c\n,(*p).num,(*p).name,(*p).sex);}通过指针访问结构中的成员:采用运算符“-”进行操作。例:p-成员名或者(*p).成员名例如:p-num=9901;strcpy(p-name,LiMin);p-sex='W';例:printf(%d,man.birthday.year);传递结构成员的值scanf(%d,&man.birthday.year);传递结构成员的地址gets(man.name);传递结构成员的地址10.4结构体类型数据在函数间的传递结构体与函数的关系◆向函数中传递结构的成员;◆在函数之间传递整个结构;◆向函数传递结构的地址(指针)。向函数中传递结构的成员在函数中传递结构成员的方法与传递简单变量的方法相同:◆在函数之间传递成员的值;◆在函数之间传递成员的地址。阅读程序:main(){structstudent{intnum;intage;};structstudentstu[3]={{1000,20},{1001,19},{1003,23}};structstudent*p;p=stu;printf(%d\n,(*p++).num);}输出结果:?改成:(*++p).num结果为:?•例:利用结构变量求解两个复数之积。(3+4i)×(5+6i)将结构作为整体,在函数之间传递:◆将结构变量作为形参;◆函数的返回值也可为一个结构类型。在函数之间传递整个结构•例:利用结构变量求解两个复数之积。(3+4i)×(5+6i)structcomplx{intreal,im;};structcomplxcmult(structcomplxza,structcomplxzb){structcomplxw;w.real=za.real*zb.real-za.im*zb.im;w.im=za.real*zb.im+za.im*zb.real;return(w);/*返回结果,为结构体类型*/}main(){structcomplxza={3,4};structcomplxzb={5,6};structcomplxz;z=cmult(za,zb);printf((%d+%di)*(%d+%di)=,za.real,za.im,zb.real,zb.im);printf((%d+%di)\n,z.real,z.im);}10.4共用体10.4.1共用体的概念共用体:使几个不同的变量共享同一段内存。“共用体”类型变量的定义形式为:union共用体名{成员表列}变量表列;或uniondata{inti;charch;floatf;};union
本文标题:c语言教程第十
链接地址:https://www.777doc.com/doc-3563481 .html