C语言程序设计_第7章 其它自定义数据类型

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第7章其它自定义数据类型C语言程序设计22020/1/197.1概述7.2结构体7.3共用体7.4枚举类型7.5类型命名32020/1/197.2结构体7.2.1结构体与结构体类型的定义结构体——一种构造类型数据结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。structstudent{charnum[8];charname[30];charsex;charaddr[60];intscore[6];};structstudents[3],t1,t2;42020/1/197.2结构体结构体——一种构造类型数据结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。structstudent{charnum[8];charname[30];charsex;charaddr[60];intage;intscore[6];};structstudents[3],t1,t2;52020/1/19struct结构体名{数据类型1成员名1;数据类型2成员名2;……数据类型n成员名n;};结构体类型定义的一般形式:struct为关键字;结构体名是用户定义的类型标识。{}中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。7.2.1结构体与结构体类型的定义62020/1/19例如学生类型的定义:structstudent{charnum[8];/*学号是字符数组类型*/charname[30];/*姓名是字符数组类型*/charsex;/*性别是字符型*/intage;/*年龄是整型*/charaddr[60];/*住址是字符数组类型*/intscore[6];/*成绩是整型数组类型*/};72020/1/197.2.2结构体变量的定义与初始化1.结构体类型变量的定义利用已定义的结构体类型名定义变量struct结构体名变量名表;例如:structstudent{charnum[8];charname[30];charsex;charaddr[60];intscore[6];};structstudents[3],t1,t2;82020/1/19在定义结构体类型的同时定义变量例如:structstudent{charnum[8],name[20],sex;intage;floatscore;}st[30];struct结构体名{成员定义表;}变量名表;92020/1/19直接定义结构体类型变量例如:struct{charnum[8],name[20],sex;intage;floatscore;}st[30],a,b,c;struct{成员定义表;}变量名表;102020/1/19结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。structstudent{charnum[8];/*学号是字符数组类型*/charname[30];/*姓名是字符数组类型*/charsex;/*性别是字符型*/intage;/*年龄是整型*/charaddr[60];/*住址是字符数组类型*/intscore[6];/*成绩是整型数组类型*/}s;112020/1/19成员也可以是结构体变量。structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;structdatabirthday;charaddr[60];intscore[6];};structstudents[3],t1,t2;printf(%d\n%d\n%d\n%d,sizeof(stuctdate),sizeof(stuctstudent),sizeof(t1),sizeof(s));num8个字节name30个字节sex1个字节birthdayyear4个字节month4个字节day4个字节addr60个字节score24个字节122020/1/19类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。结构体类型与变量的说明132020/1/192.结构体变量的初始化【例】结构体变量的初始化。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={9606011,Liming,'M',{1977,12,9},83},b={9608025,Zhangliming,'F',{1978,5,10},87},c;如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。如果初值个数多于结构体成员个数,则编译出错。142020/1/19【例】结构体数组的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{9606011,Liming,'M',87.5},{9606012,Zhangjiangguo,'M',79},{9606013,Wangping,'F',90}};元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数152020/1/193.结构体变量的运算同类型结构体变量之间的赋值运算结构体变量之间进行赋值时,系统将按成员一一对应赋值。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={9606011,Liming,'M',{1977,12,9},83},b,c;c=a;162020/1/19对结构体变量进行取址运算structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;对结构体变量a进行&a运算,可以得到a的首地址,它是结构体类型指针。172020/1/194.结构体变量成员的引用结构体变量成员引用的一般形式:结构体变量名.成员名结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.scorestructdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;a.birthday.yeara.birthday.montha.birthday.day“.”是分量运算符,运算级别最高。182020/1/19【例】编写一个统计选票的程序。structcandidate{charname[20];/*name为候选人姓名*/intcount;/*count为候选人得票数*/}list[]={{invalid,0},{Zhao,0},{Qian,0},{Sun,0},{Li,0},{Zhou,0}};192020/1/19voidmain(){inti,n;printf(Entervote\n);scanf(%d,&n);/b输入所投候选人编号,编号从1开始*/while(n!=-1)/*当输入编号为-1时,表示投票结束*/{if(n=1&&n=5)list[n].count++;/*有效票,则相应候选人计票成员加1*/else{printf(invalid\n);list[0].count++;}/*无效票,list[0]的计票成员加1*/scanf(%d,&n);/*输入所投候选人编号*/}202020/1/19for(i=1;i=5;i++)printf(%s:%d\n,list[i].name,list[i].count);printf(%s:%d\n,list[0].name,list[0].count);}212020/1/191.结构体指针变量的定义结构体指针变量定义的一般形式:struct结构体名*指针变量名;structdate{intyear,month,day;}*q;例如:structstudent*p;p是可以指向structstudent结构体变量的指针变量7.2.3结构体的指针222020/1/192.结构体成员的三种引用形式用结构体变量名的引用形式:d.yeard.monthd.daystructdate{intyear,month,day;}d,*p=&d;用结构体指针变量的引用形式:(*p).year(*p).month(*p).dayp-yearp-monthp-day“-”是指向结构体成员运算符,优先级为一级p=&d.year×232020/1/19设有如下定义:structsk{inta;floatb;}data,*q=&data;int*p;①若要使p指向data中的成员a,正确的赋值语句是。A)p=&data;B)p=&data.a;C)*p=&data;D)*p=&data.a;②正确引用data中的成员b的语句是。A)data-b;B)*q-b;C)q-b;D)p-b;242020/1/19【例7-a】输入今天的日期,然后输出该日期。voidmain(){structdate/*在函数中定义结构体类型*/{intyear,month,day;}today,*p=&today;/*定义结构体变量及其指针*/printf(Entertodaydate(YYYY/MM/DD):);scanf(%d/%d/%d,&today.year,&today.month,&today.day);printf(Today:%d/%d/%d\n,p-year,p-month,p-day);}252020/1/193.指向结构体数组的指针【例7-7】利用结构体指针输出一组化学元素名称及其原子量。structlist{inti;charname[4];floatw;}tab[4]={{1,H,1.008},{2,He,4.0026},{3,Li,6.941},{4,Be,9.01218}};tab数组1Htab[0]1.0082Hetab[1]4.00263Litab[2]6.9414Betab[3]9.01218262020/1/19voidmain(){structlist*p;printf(No\tName\tAtomicWeight\n);for(p=tab;ptab+4;p++)printf(%d\t%s\t%f\n,p-i,p-name,p-w);}tab数组1Htab[0]1.0082Hetab[1]4.00263Litab[2]6.9414Betab[3]9.01218pppppNoNameAtomicWeight1H1.0082He4.00263Li6.9414Be9.01218272020/1/19【例7-8】分析自增自减运算对程序结果的影响。structcode{inti;charch;}a[]={{100,'A'},{200,'B'},{300,'C'},{400,'D'}};(接后面)a数组100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'282020/1/19voidmain(){structcode*p=a;printf(%d\t,++p-i);printf(%c\t,(++p)-ch);printf(%d\t,(p++)-i);printf(%c\t,++p-ch);printf(%d\t,p-i++);printf(%d\n,p-i);}a数组100a[0]'A'200a[1]'B'300a[2]'C'400

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功