理学结构体与共用体_第1页
理学结构体与共用体_第2页
理学结构体与共用体_第3页
理学结构体与共用体_第4页
理学结构体与共用体_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

厦门理工学院计算机科学与技术系1

1本章主要内容结构体类型与结构体变量结构体数组共用体枚举类型typedef定义类型

厦门理工学院计算机科学与技术系2

结构简介存储一个班级中5名学员的信息(学号、姓名、性别和成绩)问题:I.使用数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解决方案:scorenumsexname不能建立数组间的关系II.使用多维数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C语言不允许一个数组包含多种数据类型III.使用结构体numnamesexscoreC语言引入了称为结构体的数据存储方式“结构体”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。

厦门理工学院计算机科学与技术系3

5.1结构体的定义structstructurename{ datatypevariable1; datatypevariable2; ...};结构体成员{};结构体名structstudentintnum;charname[20];charsex;定义结构体floatscore;C语言中的有效数据类型

厦门理工学院计算机科学与技术系4

structstudent{intnum;charname[20];charsex;floatscore;};numnamesexstudent结构体定义放置在程序的开始部分,位于头文件声明之后;score结构体定义仅描述了一个结构的形式。如果要在程序里使用结构体,需要声明结构体变量。5.1结构体变量的定义

厦门理工学院计算机科学与技术系5

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];};结构体类型名结构体各成员定义结构体类型大括号外要加分号structstudentstu1,stu2;

系统不为结构体类型的定义开辟内存单元,只当定义了结构体变量后才会为变量分配相应大小的内存单元。stu1和stu2在内存占几个字节?声明一个类型为student结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。

厦门理工学院计算机科学与技术系6

声明结构变量structstudent{intnum;charname[20];charsex;floatscore;};structstudentstudent1,student2;I.先定义结构,再声明结构变量structstudent{intnum;charname[20];charsex;floatscore;}student1,student2;II.在定义结构类型的同时声明结构变量struct{intnum;charname[20];charsex;floatscore;}student1,student2;III.直接声明结构变量5.1结构体变量的定义

厦门理工学院计算机科学与技术系7

几点说明:结构体类型与结构体变量概念不同类型:不分配内存;

变量:分配内存

类型:不能赋值、存取、运算;

变量:可以(2)结构体可以嵌套

例:

structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}student1;numnamebirthdaymonthdayyear例:

structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}

birthday;}student1; numnamebirthdaymonthdayyearstructPoint{intx,y;};structImg{inttag;structImg*pimg;//正确,可以包含自身类型的指针

structImgimg;//错误,不能包含自身类型的变量};

厦门理工学院计算机科学与技术系8

structdate{intmonth;intday;intyear;};struct{intnum;charname[20];charsex;

structdatebirthday;floatscore;}student1,student2;表示结构变量成员的一般形式是:结构变量名.成员名例如:student1.num、student2.sex、student1.birthday.month、嵌套结构structStudentstudent1;charname[20];(3)结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰

厦门理工学院计算机科学与技术系9

结构体变量初始化赋值先定义结构体类型,再定义结构体变量时赋初值struct

结构体类型名初值表{……};struct结构体类型名变量名={成员1的值,…,成员n的值};

注意:赋初值时,{}中间的数据顺序必须与结构体成员的定义顺序一致,否则就会出现混乱。structStudentstu={"20020306","ZhangMing",'M',18,1,90};

nonamesexageclassnoscore√structStudentstu={18,"ZhangMing",'M',"20020306",1,90};

×structDate{intyear;//年

intmonth;//月

intday;//日};structStudent{charno[9];//学号

charname[20];//姓名

charsex;//性别

structDatebirthday;

//生日

unsignedintclassno;//班级

floatscore;//成绩};structStudentstu={"20020306","ZhangMing",'M',{1986,12,10},1,90};

5.1结构体变量的赋值

厦门理工学院计算机科学与技术系10

结构体变量初始化赋值定义结构体类型的同时,定义结构体变量并赋初值struct[结构体类型名]{初值表

……}变量名={成员1的值,成员2的值,…,成员n的值};structDate

{intyear,month,day;}birthday={1986,12,10};

struct

{intyear,month,day;}birthday={1986,12,10};

或structStudent{charno[9];//学号

charname[20];//姓名

charsex;//性别

unsignedintage;//年龄

unsignedintclassno;//班级

floatgrade;//成绩}stu={"20020306","ZhangMing",'M',18,1,90};

厦门理工学院计算机科学与技术系11

structStudentstu1;

strcpy(stu1.no,"20020306");strcpy(,"ZhangMing");stu1.sex='M';stu1.age=18;stu1.classno=1;stu1.grade=90;structStudentstu2;stu2=stu1;结构体变量在程序中赋值

如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员逐一赋值,或者用已赋值的同类型的结构体变量对它赋值

逐一赋值利用已赋值的结构体变量赋值(同一结构体的不同变量之间)strcpy(stu2.no,stu1.no);strcpy(,);stu2.sex=stu1.sex;stu2.age=stu1.age;stu2.classno=stu1.classno;stu2.grade=stu1.grade;

厦门理工学院计算机科学与技术系12

student1student1.num=1;student1.name="ZhangZiLiang";student1.sex=’M’;printf("请输入年龄:\n");scanf("%d",&student1.age);1ZhangZiLiangM用输入语句或赋值语句来给结构体变量的各个成员赋值1818student2=student1;student21ZhangZiLiangM18

厦门理工学院计算机科学与技术系13

内存student3structstudentstudent3={3,"YaoMing",'M',90.5};

3YaoMingM定义时赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构体成员数目少。student3.numstudent3.sex90.5student3.score

厦门理工学院计算机科学与技术系14

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;if(student1==student2)……..(

)引用规则结构体变量不能整体引用,只能引用变量成员引用方式:结构体变量名.成员名//非指针型结构体变量的引用可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符结合性:从左向右例

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;

student1.num=10;student1.score=85.5;student1.score+=student2.score;student1.age++;例

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;printf(“%d,%s,%c,%d,%f,%s\n”,student1);(

)student1={101,“WanLin”,‘M’,19,87.5,“DaLian”};(

)结构体变量名.成员名.子成员名……最低级子成员名例

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;student2=student1;(√)5.1结构体变量的引用

厦门理工学院计算机科学与技术系15

引用规则可以引用结构体成员的地址,也可以引用结构体变量的地址scanf(“%d”,&student1.num);printf(“%d”,&student1);它们要做什么?可以对结构体成员进行各种有关的运算student1.age++;If(student1.age==student2.age)printf(“thetwoareasolderaseachother.\n”);结构体变量的成员在引用时和其同类型的普通变量引用方法一致。

厦门理工学院计算机科学与技术系16

structstudent{intnum;charname[20];charsex;floatscore;}stu[30];元素为结构体类型的数组称为结构体数组。在实际应用中,经常用结构体数组来表示具有相同数据结构体的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构体数组stu1,共有30个元素,stu[0]~stu[29]。每个数组元素都具有structstudent的结构体形式。5.2结构体数组

厦门理工学院计算机科学与技术系17

175.2结构体数组structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu[3];structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu;A、结构体数组定义

厦门理工学院计算机科学与技术系18

numnamesexagescoreaddress1001LinNinF1479103BeijingRoad1002ZhangFanM158046TangshanRoad1003WangYingF148610ZhongshanRoad18结构体数组示例5.2结构体数组

厦门理工学院计算机科学与技术系19

B、结构体数组初始化structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu[3]={{1001,"LiNin",'M',14,79,"103BeijingRoad"},{1002,,"ZhangFan",'M',15,80,"46TangshanRoad"},{1003,"WangYing",'F',14,86,"10ZhongshanRoad"}};19

厦门理工学院计算机科学与技术系20

#include<stdio.h>voidmain(){structSTUD{charname[20];longnum;intage;charsex;floatscore;}stud[3];inti;for(i=0;i<3;i++){printf("InputallinformationabouttheNo.%dstudent:\n",i+1);gets(stud[i].name);scanf("%ld,%d,%c,%f",&stud[i].num,&stud[i].age,&stud[i].sex,&stud[i].score);getchar();}printf("\n%-20s%-10s%-4s%-4s%-6s\n","Name","Num","Age","Sex","Scores");for(i=0;i<3;i++) printf("%-20s%-10ld%-4d%-4c%-6.2f\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex,stud[i].score);}20例5.2由键盘输入学生信息,并将其输出。

厦门理工学院计算机科学与技术系21

5.5共用体学生的信息:学号姓名地址电话班级10010LiFuzhou125630722老师的信息:工号姓名地址电话职务10852WangXiamen35286prof.类别's'类别't'

厦门理工学院计算机科学与技术系22

使几个不同的变量共占同一段内存的结构称为共用体类型的结构。定义共用体类型变量的一般形式为:union共用体名{成员表列}变量表列;structstuTeacher{ intnum; charname[20];charaddr[50]; chartel[8];chartype;

unioninfo { charclass[10]; charjob[20]; };}1.共用体类型的定义

厦门理工学院计算机科学与技术系23

例如:uniondatauniondata

{inti;{inti;charch;或charch;floatf;floatf;}a,b,c;}; uniondataa,b,c;chif思考:变量a,b,c所占内存空间有多少?

厦门理工学院计算机科学与技术系24

对于共用体变量的定义:uniondata{ inti; charch; floatf;}a;成员的引用:a.ia.cha.f

厦门理工学院计算机科学与技术系25

voidmain(){ uniondata { inti; charch; floatf; }a; a.ch=65; a.i=28; printf("i=%d\n",a.i); printf("ch=%c\n",a.ch); printf("f=%4.1f\n",a.f);}对共用体中的i成员赋值,之前对成员ch赋值不再起作用,此时仅成员i起作用,其余成员不起作用。共用体变量和其各成员的地址均是一样的。对共用体变量不能初始化,不能对共用体变量名赋值。共用体和结构体的比较

厦门理工学院计算机科学与技术系26

5.6枚举类型如果一个变量只有几种可能的值,可以把它定义成枚举类型。所谓“枚举”,顾名思义,就是把这种类型数据可取的值一一列举出来。一个枚举型变量取值仅限于列出值的范围。枚举数据类型通常的定义形式为:enum

枚举类型名{

枚举元素表};由多个标识符组成,标识符之间用逗号分开定义枚举类型:enumweekday{sun,mon,tue,wed,thu,fri,sat};定义枚举类型变量:enumweekday

today,nextday;enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;取值

厦门理工学院计算机科学与技术系27

enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;today=sun;nextday=mon;if(today==sat)nextday=sun;today=100;

√×

C编译对枚举元素实际上按整型常量处理,当遇到枚举元素列表时,编译程序就把其中第一个标识符赋0值,第二、三、…个标识符依此赋1,2,…。enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;0123456today=sun;printf("today=%d",today);运行结果:today=0

厦门理工学院计算机科学与技术系28

if(today==6)nextday=0;if(today==sat)nextday=sun;可以在枚举类型定义时指定枚举元素的值

enumweekday{sun,mon=5,tue,wed=10,thu,fri,sat};05610111213注意:枚举元素是常量,在程序中不可对它赋值。例如:sun=0;mon=1;将产生错误。定义枚举类型的好处:

用标识符表示数值,增加了程序的可读性清晰不清晰

可限制变量的取值范围

如today只能取sun~sat中的值

厦门理工学院计算机科学与技术系29

例题5-10枚举元素序号Voidmain(){

enumweekday{sun,mon,tue,wed,thu,fri,sat}

a,b,c;a=sun;b=mon;c=tue;printf(“%d,%d,%d”,a,b,c);}思考:运行结果?

厦门理工学院计算机科学与技术系30

5.8程序设计举例例5-11已知某年的元旦是星期几,打印该年某一月份的日历表#include"stdio.h"typedefstruct{ intyear,mon,day; enumweekday {nun,mon,tue,wed,thu,fri,sat}week;}daily;

voidmain(){dailydays;

printf("Whichyear?");scanf("%d",&days.year);/*哪年日历*/printf("year%4d,Month1,day1isweekday?\n",days.year);printf("-Sun,1-Mon,2-Tue,3-Wed,4-Thu,5-Fri,6-Sat:");scanf("%d",&days.week);days.mon=days.day=1;montable(days);}30

厦门理工学院计算机科学与技术系31

monta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论