您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言程序设计――结构体和共用体(完整版)
第十二章问题:有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如:一个学生有学号/姓名/性别/年龄/地址等属性intnum;charname[20];charsex;intage;intcharaddr[30];100101LiFunM1887.5Beijingnumnamesexagescoreaddr§12.2结构体的定义结构是一种构造数据类型(“结构”是由若干个成员组成的),在使用之前必须先定义,然后才能用来定义相应的结构体变量、结构体数组、结构体指针变量。结构体类型一般形式:struct结构体名{成员列表};其中各成员都应进行类型说明,即类型名成员名;例:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};结构体变量的定义(1)先声明结构类型,再定义结构体变量例:structstudent{intnum;charname[20];floatscore;};structstudentstu1,stu2;结构体变量的定义(2)在声明结构类型的同时定义结构体变量例:structstudent{intnum;charname[20];floatscore;}stu1,stu2;结构体变量的定义(3)直接定义结构体类型变量例:struct{intnum;charname[20];floatscore;}stu1,stu2;结构体变量的引用一般对结构体变量的使用,包括赋值、输入、输出、运算等都是通过其成员来实现的。结构体变量成员的表示方法:结构体变量名.成员名例:stu1.num(学生1的学号)stu1.score(学生1的分数)结构体变量的初始化和其他类型变量一样,定义结构体变量的同时,给它的成员赋初值。例:#includestdio.hvoidmain(){structstudent{intnum;charname[20];floatscore;}stu1={1301,”ZhangSan”,82.50};printf(“No.%d,Name:%s,Score:%f\n”,stu1.num,stu1.name,stu1.score);}结构体变量的赋值通过输入语句或赋值语句,实现对结构体变量的成员赋值。例:#includestdio.hvoidmain(){structstudent{intnum;charname[20];floatscore;}stu1;stu1.num=1301;stu1.name=”ZhangSan”;scanf(“%f”,&stu1.score);printf(“No.%d,Name:%s,Score:%f\n”,stu1.num,stu1.name,stu1.score);}嵌套的结构体一个结构体的成员又是一个结构体。例:structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;charsex;}intage;structdatebirthday;charaddr[30];};birthdaynumnamesexageaddrmonthdayyear§12.3结构体数组结构体数组的每一个元素都是具有相同结构类型的结构体变量。例:structstudent{intnum;charname[20];floatscore;}stu[3];其中,定义了一个结构体数组stu,共有3个元素,每个元素都具有structstudent的结构形式。结构体数组的初始化赋值例:structstudent{intnum;charname[20];floatscore;}stu[3]={{1301,”ZhangSan”,57},{1302,“LiSi”,82.50},{1303,“WangWu”,69}};当对全部元素进行初始化赋值时,也可以不给出长度。§12.4结构体指针变量12.4.1指向结构体变量的指针一般形式为:struct结构名*结构体指针变量名;例:structstudent{intnum;charname[20];floatscore;};structstudent*pstu;其中定义了一个指向student的指针变量pstu。12.4.1指向结构体变量的指针变量用结构体指针变量,访问结构体变量的各个成员,一般形式为:(*结构体指针变量).成员名;或结构体指针变量-成员名;例:(*pstu).num或pstu-num例:#includestdio.hvoidmain(){structstudent{intnum;charname[20];floatscore;}stu1={1301,”ZhangSan”,82.50},*pstu;pstu=&stu1;printf(“No.%d,Name:%s,Score:%f\n”,stu1.num,stu1.name,stu1.score);printf(“No.%d,Name:%s,Score:%f\n”,(*pstu).num,(*pstu).name,(*pstu).score);printf(“No.%d,Name:%s,Score:%f\n”,pstu-num,pstu-name,pstu-score);}12.4.2指向结构体数组的指针变量结构体指针变量可指向一个结构体数组,其指针变量的值是整个结构体数组的首地址。例:设ps为指向结构体数组的指针变量,则ps指向该结构体数组的0号元素;ps+1指向该结构体数组的1号元素。例:#includestdio.hvoidmain(){structstudent{intnum;charname[20];floatscore;}stu[3]={{1301,”ZhangSan”,57},{1302,“LiSi”,82.50},{1303,“WangWu”,69}};structstudent*ps=stu;ps++;printf(“No.%d,Name:%s,Score:%f\n”,ps-num,ps-name,ps-score);}§12.5向函数传递结构体(3种方式)1.用结构体的单个成员作为函数参数,向函数传递结构体的单个成员。这与普通类型的变量作函数参数没什么区别,都是传值调用,在函数内部对其进行操作,不会引起实参结构体成员值的变化。2.用结构体变量作为函数参数,向函数传递结构体的完整结构。这种传递,是将整个结构体成员的内容复制给被调函数。这种方式是传值调用,在函数内部对其进行操作,不会引起实参结构体成员值的变化。3.用结构体指针或结构体数组作为函数参数,向函数传递结构体的地址。由于是传地址调用,在函数内部对其进行操作,将影响实参结构体成员值的变化。§12.6共用体共用体(也称为联合)也是一种构造的数据类型。共用体是将不同类型的数据组织在一起共同占用同一段内存的一种构造数据类型。例如,在校学生和教师都填写以下表格:姓名年龄职业单位其中,职业分两类:教师和学生;而单位一栏里,学生填写班级编号(整型类型),教师填写某系某教研室(整型类型)。共用体的定义共用体与结构体的类型声明方法类似。共用体的关键字为union。一般形式:union共用体名{成员列表};其中各成员都应进行类型说明,即类型名成员名;uniondepartment{intclass;charoffice[20];};共用体变量的说明(3种形式)(1)uniondepartment先定义再说明;{intclass;charoffice[20];};uniondepartmenta,b;(2)uniondepartment定义同时说明;{intclass;charoffice[20];}a,b;(3)union直接说明。{intclass;charoffice[20];}a,b;共用体与结构体的区别(1)结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有自己的内存单元。(2)共用体变量所占内存长度是最长的成员的长度。即共用体变量的地址和它的各成员的地址是同一地址。共用体变量的引用对共用体变量的使用,包括赋值、使用只能是对变量的成员进行。共用体变量成员的表示方法:共用体变量名.成员名例:a.classa.office不允许对共用体变量作初始化赋值,赋值只能在程序中进行。#includestdio.h#definePN3voidmain(){struct{charname[10];intage;charjob;union{intclass;charoffice[10];}units;}body[PN];例:设有一个教师和学生通用的表格,有姓名、年龄、职业、单位4项。在职业项中,用‘s’表示学生,用‘t’表示教师。编程输入人员数据,再以表格输出。intn,i;for(i=0;iPN;i++){printf(“inputname,age,jobanddepartment\n”);scanf(“%s%d%c”,body[i].name,&body[i].age,&body[i].job);if(body[i].job==‘s’)scanf(“%d”,&body[i].units.class);elsescanf(“%s”,body[i].units.office);}printf(“name\tage\tjob\tclass/office\n”);for(i=0;iPN;i++){if(body[i].job==‘s’)printf(“%s\t%d\t%3c\t%d\n”,body[i].name,body[i].age,body[i].job,body[i].units.class);elseprintf(“%s\t%d\t%3c\t%s\n”,body[i].name,body[i].age,body[i].job,body[i].units.office);}}§12.7枚举数据类型当某些变量仅由有限个数据值组成时,通常用枚举类型来表示。所谓枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。如一周只有7天,一年只有12个月等等。注意:枚举类型是一种基本数据类型,而不是一种构造类型。关键字为enum。一般形式:enum枚举名{枚举值表};在枚举值表中应罗列出所有可用值,这些值称之为枚举元素。例:enumweekday{sun,mon,tue,wed,thu,fri,sat};声明了一个枚举类型enumweekday,可以用此类型来定义变量,该变量只能取7天中的某一天。枚举变量的说明(3种形式)(1)enumweekday先定义再说明;{sun,mon,tue,wed,thu,fri,sat};enumweekdaya,b,c;(2)enumweekday定义同时说明;{sun,mon,tue,wed,thu,fri,sat}a,b,c;(3)enum直接说明。{sun,mon,tue,wed,thu,fri,sat}a,b,c;;枚举变量的赋值和使用(1)在C编译中,对枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们赋值。例:sun=5;mon=2;sun=mon;是错误的。枚举变量的赋值和使用(2)枚举元素本身由系统定义为有序号的数值,从0开始顺序定义为0,1,2,…例如在weekday中,sun值为0,mon值为1,…,sat值为6。这个序号值是可以输出的。例:#includestdio.hvoidmain(){enumweekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;a=sun;b=mon;c=tue;printf(“%d,%d,%d”a,b,c);}运行结果:0,1,2枚举变量的赋值和使用(3)只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。例:a=sun;b=mon;是正确的。a=0;b=1;是错误的。如果一定要把数值赋予枚举变
本文标题:C语言程序设计――结构体和共用体(完整版)
链接地址:https://www.777doc.com/doc-3156732 .html