第11章 结构体、联合体与位运算

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

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

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

资源描述

1第11章结构体、联合体与位运算一、考点掌握结构体类型的定义方法了解枚举类型的定义和使用和typedef定义类型掌握结构体类型变量的定义初始化和引用了解指向结构体类型数据的指针的使用掌握结构体数据类型的使用(以链表为例)掌握共同体的概念掌握位运算符的功能及使用方法二、知识点1、结构体类型结构体是一种构造类型,它由若干“成员”组成。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体既然是一种构造而成的数据类型,那么在使用之前必须先定义它,如同在调用函数之前要先定义或声明一样。定义一个结构体类型的一般形式为:struct结构体名{成员1类型1;成员2类型2;...成员n类型n;};结构体中的每个成员均须作类型说明,成员名的命名应符合标识符的书写规定,成员名可以与程序中的变量名同名,二者不代表同一对象,互不干扰。例如:structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/};应注意末尾的分号是必不可少的。定义结构体类型的变量有以下三种方法。a)先定义结构体类型,再定义变量。structstudent{intnum;charname[20];charsex;intage;2floatscore;};structstudentstudent1,student2;在定义了structstudent这个结构体类型之后,再用这个类型标识符去定义了两个结构体变量student1与student2。b)在定义结构类型的同时定义结构体变量。例如:structstudent{intnum;charname[20];charsex;intage;floatscore;}student1,student2;这是一种紧凑形式,既定义了类型,同时又定义了变量。如果需要,下文还可再用structstudent定义其它同类型变量。它的一般形式为:struct结构体名{成员1类型1;成员2类型2;...成员n类型n;}变量名表列;c)直接定义结构体变量。例如:struct{intnum;charname[20];charsex;intage;floatscore;}student1,student2;直接定义了两个结构体变量student1与student2。上述三种方法中定义的变量student1与student2都具有下图所示的结构,其所有的成员都是基本数据类型或数组类型。numnamesexagescore图11-23若想将其中的age换成出生日期birthday,定义成含有年份、月份、日期三个子成员的类型,如图11-3所示,则需先定义一个structdate日期类型,再用它去定义birthday。这就形成了嵌套的结构体。numnamesexbirthdayScoreyearmonthday图11-3按图可给出以下结构定义:structdate{intyear;intmonth;intday;};structstudent{intnum;charname[20];charsex;structdatebirthday;floatscore;}student1,student2;首先定义一个结构体类型structdate,由month(月)、day(日)、year(年)三个成员组成。再将它用到structstudent类型的定义中,使其中的成员birthday被定义为structdata类型。类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。1)结构体变量的引用a)引用结构体变量中的一个成员由于一个结构体变量包含多个成员,要访问其中的一个成员,必须同时给出这个成员所属的变量名以及其中要访问的成员名本身,引用方式为:结构体变量名.成员名其中的圆点符号称为成员运算符。对成员变量可以象普通变量一样进行各种操作。例如,将学号11301赋给student1中的num,应写成以下形式:student1.num=11301;将姓名“ZhangPing”通过键盘赋给student1中的name,应写成:scanf(%s,&student1.name);将student2中的score加1,然后输出该值,应写成:student2.score=student2.score+1;或student2.score++;4printf(%f,student2.score);成员运算符的运算级别最高,例如:student.num+100,在num两侧有二个运算符,由于成员运算符的运算优先于加号运算符,故相当于(student.num)+100b)成员本身又是结构体类型时的子成员的访问如果成员本身又是一种结构体类型时,那么对其下级子成员再通过成员运算符去访问,一级一级地直到最后一级成员为止。例如上文提到的birthday,可以这样去访问:student1.numstudent1.birthday.yearstudent1.birthday.monthstudent1.birthday.daystudent1.score这里,student1.birthday本身相当于一个结构体变量。注意下述用法是错误的:year/*少了上两级所属主体*/birthday.year/*少了结构体变量主体*/student1.year/*不能跨级访问*/year.birthday.student1/*不能颠倒次序*/c)同一种类型的结构体变量之间可直接赋值一般地,可以将一个结构体变量作为一个整体赋给另一个具有相同类型的结构体变量。例如:student2=student1;student1与student2两者类型相同,上述赋值语句相当于将student1中各个成员的值逐个依次赋给student2中的相应成员。若两者的类型不一致时,则不能直接赋值。通常,也可以把一个结构体变量中的内嵌结构体类型成员赋给同种类型的另一个结构体变量的相应部分。如下列语句是合法的:student2.birthday=student1.birthday;d)不允许将一个结构体变量作为一个整体进行输入或输出下述用法是错误的:scanf(%d,%s,%c,%d,%f,&student1);/*错*/printf(%d,student1);/*错*/printf(%d,%s,%c,%d,%f,student1);/*错*/e)一个结构体变量所占用的存储空间就是其所有成员所占空间之和。2)结构体变量的初始化与其他类型变量一样,对结构体变量也可以在定义时进行初始化赋值,但附在变量后面的一组数据须用花括号括起来,其顺序应与结构体中的成员顺序保持一致。【例11-1】对结构体变量初始化。5main(){structstudent{intnum;charname[20];charsex;intage;floatscore;}student1={11301,ZhangPing,'F',19,496.5};printf(Number=%d\nName=%s\n,student1.num,student1.name);printf(Score=%f\n,student1.score);}运行结果如下:Number=11301Name=ZhangPingScore=496.500000本例中,student1在被定义的同时,其各成员也按顺序被赋予了相应的一组数据。2、结构体数组1)结构体数组的定义定义结构体数组的方法与定义结构体变量方法相似,只是要多用一个方括弧以说明它是个数组。如:structstudent{intnum;charname[20];charsex;intage;floatscore;}student1,stu[30];以上定义了一个结构体变量student1和一个结构体数组stu,这个数组有30个元素,每一个元素都是structstudent类型的,如图11-4所示。数组各元素在内存中占用连续的一段存储单元。numnamesexagescorestu[0]11301ZhangPingF19496.5stu[1]11302WangLiF20483………………stu[29]11330MaoQiangM18502图11-4结构体数组定义之后,要引用某一元素中的一个成员,可采用以下形式:stu[i].score式中i为数组元素的下标。62)结构体数组的初始化只有对定义为外部的或静态的数组才能初始化。在对结构体变量初始化时,要将每个元素的数据分别用花括弧括起来。【例11-2】设有四位同学的有关数据,试统计出他们的平均年龄和平均成绩。structstudent{intnum;charname[20];charsex;intage;floatscore;};structstudentstu[4]={{11301,ZhangPing,'F',19,496.5},{11302,WangLi,'F',20,483},{11303,LiuHong,'M',19,503},{11304,SongRui,'M',19,471.5}};main(){inti;floata,s;for(i=0;i4;i++){a=a+stu[i].age;s=s+stu[i].score;}printf(Theaverageageis%6.2f\n,a/4);printf(Theaveragescoreis%6.2f\n,s/4);}运行结果如下:Theaverageageis19.25Theaveragescoreis488.503、结构体指针变量结构体指针变量的值就是所指结构体变量在内存单元中的起始地址。指针变量也可用来指向结构体数组中的元素。a)结构体指针变量定义结构体指针变量的一般形式如下:structstudent*p;上述语句定义了一个指针变量p,它可以指向任何一个属于structstudent类型的数据。通过指针去访问所指结构体变量的某个成员时,有如下两种方法:(*p).score或者p-score7后者是常见的一种使用方式,其中-称为指向运算符。【例11-3】用指针访问结构体变量及结构体数组structstudent{intnum;charname[20];charsex;intage;floatscore;};structstudentstu[3]={{11302,Wang,'F',20,483},{11303,Liu,'M',19,503},{11304,Song,'M',19,471.5}};main(){structstudentstudent1={11301,ZhangPing,'F',19,496.5},*p,*q;inti;p=&student1;/*让指针p指向结构体变量student1,如图11-5所示*/printf(%s,%c,%5.1f\n,student1.name,(*p).sex,p-score);q=stu;/*让指针p指向数组stu,即指向数组中的第一个元素stu[0],如图11-6所示*/for(i=0;i3;i++,q++)printf(%s,%c,%5.1f\n,q-name,q-sex,q-score);}运行结果如下:ZhangPing,F,496.5Wang,F,483.0Liu,M,503.08Song,M,471.5指针符号“-”的使用比较常见。请分析以下几种运算:p-age得到p指向的结构体变量中的成员age的值;p-age++先引用p所指成员age的值,用完后再使该成员值加1;++p-age先使p所指成员age的值加1,然后再引用这个新值;(p++)-age先引用p-age的值,用完后再使指针p加1;(++p)-age先使指针p加1,然后再引用p-age这个值;

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

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

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

×
保存成功