您好,欢迎访问三七文档
第二十讲结构体变量1、结构体与结构体类型的定义信息管理一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?结构体——一种构造类型数据结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员结构体类型定义的一般形式:struct结构体名{数据类型1成员名1;数据类型2成员名2;……数据类型n成员名n;};struct为关键字;结构体名是用户定义的类型标识。{}中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。例如学生类型的定义:structstudent{charnum[8];/*学号是字符数组类型*/charname[30];/*姓名是字符数组类型*/charsex;/*性别是字符型*/intage;/*年龄是整型*/charaddr[60];/*住址是字符数组类型*/intscore[6];/*成绩是整型数组类型*/};1.1结构体类型变量的定义利用已定义的结构体类型名定义变量struct结构体名变量名表;例如:structbookcardbook1[100];structstudents[30],t1,t2;按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;structdatebirthday;/*成员为结构体类型*/charaddr[60];intscore[6];};对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员名可与程序中的变量名相同时,也可与不同结构体类型的成员名相同,二者代表不同的对象。在定义结构体类型的同时定义变量struct结构体名{成员定义表;}变量名表;例如:structstudent{charnum[8],name[20],sex;intage;floatscore;}st[30];直接定义结构体类型变量struct{成员定义表;}变量名表;例如:struct{charnum[8],name[20],sex;intage;floatscore;}st[30],a,b,c;1.2结构体变量的初始化【例】结构体变量的初始化。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值。如果初值个数多于结构体成员个数,则编译出错。【例】结构体数组的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{9606011,Liming,'M',87.5},{9606012,Zhangjiangguo,'M',79},{9606013,Wangping,'F',90}};元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数1.3结构体变量的运算用sizeof运算符计算结构体变量所占内存空间structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;sizeof(a)的结果为8+20+1+6+4=39sizeof(structstudent)的结果为39同类型结构体变量之间的赋值运算structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={9606011,Liming,'M',{1977,12,9},83},b,c;c=a;结构体变量之间进行赋值时,系统将按成员一一对应赋值。对结构体变量进行取址运算structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;对结构体变量a进行&a运算,可以得到a的首地址,它是结构体类型指针。1.4结构体变量成员的引用结构体变量成员引用的一般形式:结构体变量名.成员名“.”是分量运算符,运算级别最高。结构体变量的各个成员可进行何种运算,由该成员的数据类型决定structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.score【例】编写一个统计选票的程序。structcandidate{charname[20];/*name为候选人姓名*/intcount;/*count为候选人得票数*/}list[]={{invalid,0},{Zhao,0},{Qian,0},{Sun,0},{Li,0},{Zhou,0}};main(){inti,n;printf(Entervote\n);scanf(%d,&n);/*输入所投候选人编号,编号从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);/*输入所投候选人编号*/}for(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);}2、结构体指针变量的定义结构体指针变量定义的一般形式:struct结构体名*指针变量名;例如:structstudent*p;p是指向structstudent结构体变量的指针变量structdate{intyear,month,day;}*q;2.1结构体成员的三种引用形式structdate{intyear,month,day;}d,*p=&d;用结构体变量名的引用形式:d.yeard.monthd.day用结构体指针变量的引用形式:(*p).year(*p).month(*p).dayp-yearp-monthp-day“-”是指向结构体成员运算符,优先级为一级【例】输入今天的日期,然后输出该日期。main(){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);}2.2指向结构体数组的指针【例】利用结构体指针输出一组化学元素名称及其原子量。structlist{inti;charname[4];floatw;}tab[4]={{1,H,1.008},{2,He,4.0026},{3,Li,6.941},{4,Be,9.01218}};main(){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);}【例】分析自增自减运算对程序结果的影响。structcode{inti;charc;}a[]={{100,'A'},{200,'B'},{300,'C'},{400,'D'}};main(){structcode*p=a;printf(%d\t,++p-i);printf(%c\t,(++p)-c);printf(%d\t,(p++)-i);printf(%c\t,++p-c);printf(%d\t,p-i++);printf(%d\n,p-i);}101B200D3003013、函数间结构体数据的传递【例】编制一个复数乘法函数,采用值传递的方法传送数据。structcomplex/*定义存放复数的结构体类型*/{floatre;/*re成员用于存放复数的实部*/floatim;/*im成员用于存放复数的虚部*/};structcomplexmultiplier(structcomplexcx,structcomplexcy){structcomplexcz;cz.re=cx.re*cy.re-cx.im*cy.im;cz.im=cx.re*cy.im+cx.im*cy.re;return(cz);}形参是结构体变量。调用此函数时,系统将分别为形参cx和cy各分配一个sizeof(structcomplex)大小的内存空间,每个成员都要一一传递。main(){structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;z=multiplier(x,y);printf(%f+%fi\n,z.re,z.im);/*以复数形式输出*/}【例】编制一个复数乘法函数,采用传递指针的方法达到传送数据的目的。structcomplex{floatre,im;};voidmultiplier(structcomplex*px,structcomplex*py,structcomplex*pz){pz-re=px-re*py-re-px-im*py-im;pz-im=px-re*py-im+px-im*py-re;}形参定义为指针型参数。函数调用时,实参传递的是结构体指针(地址),因此形参px、py可读取主调函数中变量的内容,乘积结果也可通过形参pz指针存到主调函数中的目标变量。这样实参与形参之间的数据传递由多值(每个成员的值)变成了单值(结构体变量的首地址)。main(){structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;multiplier(&x,&y,&z);printf((%f+%fi)*(%f+%fi)=%f+%fi\n,x.re,x.im,y.re,y.im,z.re,z.im);}
本文标题:第二十讲结构体变量
链接地址:https://www.777doc.com/doc-2185320 .html