结构体与公用体.ppt
- 文档编号:1099721
- 上传时间:2022-10-17
- 格式:PPT
- 页数:86
- 大小:1.56MB
结构体与公用体.ppt
《结构体与公用体.ppt》由会员分享,可在线阅读,更多相关《结构体与公用体.ppt(86页珍藏版)》请在冰豆网上搜索。
第十一章,结构体与共用体,主要内容,11.1概述11.2定义结构体类型变量的方法11.3结构体变量的引用11.4结构体变量的初始化11.5结构体数组11.6指向结构体类型数据的指针11.7用指针处理链表11.8共用体11.9枚举类型11.10用typedef定义类型,11.1概述,有时需要将不同类型的数据组合成一个有机的整体,以便于引用。
例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项。
这些项都与某一学生相联系。
如果将num、name、sex、age、score、addr分别定义为互相独立的简单变量,难以反映它们之间的内在联系。
应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同的数据项。
C语言允许用户自己指定这样一种数据结构,它称为结构体(structure)。
11.1概述,假设程序中要用到上图所表示的数据结构,但是C语言没有提供这种现成的数据类型,因此用户必须要在程序中建立所需的结构体类型。
例如:
structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,11.1概述,声明一个结构体类型的一般形式为:
struct结构体名成员表列;如:
structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,结构体名,类型名,成员名,11.2定义结构体类型变量的方法,1.先声明结构体类型再定义变量名如上面已定义了一个结构体类型structstudent,可以用它来定义变量。
如:
structstudentstudent1,student2结构体类型名结构体变量名;定义了student1和student2为structstudent类型的变量,即它们具有structstudent类型的结构。
在定义了结构体变量后,系统会为之分配内存单元。
例如student1和student2在内存中各占59个字节(2+20+1+2+4+30=59)。
structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,11.2定义结构体类型变量的方法,
(2)在声明类型的同时定义变量这种形式的定义的一般形式为:
struct结构体名成员表列变量名表列;,11.2定义结构体类型变量的方法,3.直接定义结构类型变量其一般形式为struct成员表列变量名表列;即不出现结构体名。
关于结构体类型几点说明,
(1)类型与变量是不同的概念,不要混同。
(2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
(3)成员也可以是一个结构体变量。
如:
structstudentintnum;charname20;charsex;intage;structdatebirthday;charaddr30;student1,student2;,structdateintmonth;intday;intyear;;,关于结构体类型几点说明,(4)成员名可以与程序中的变量名相同,二者不代表同一对象。
例如,程序中可以另定义一个变量num,它与structstudent中的num是两回事,互不干扰。
11.3结构体变量的引用,在定义了结构体变量以后,当然可以引用这个变量。
但应遵守以下规则:
(1)不能将一个结构体变量作为一个整体进行输入和输出。
例如:
已定义student1和student2为结构体变量并且它们已有值。
printf(“%d,%s,%c,%d,%f,%n”,student1);,只能对结构体变量中的各个成员分别进行输入和输出。
引用结构体变量中成员的方式为:
结构体变量名.成员名,11.3结构体变量的引用,例如:
student1.num表示student1变量中的num成员,即student1的num(学号)项。
可以对变量的成员赋值,例如:
student1.num=10010;“.”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待。
上面赋值语句的作用是将整数10010赋给student1变量中的成员num。
(2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。
只能对最低级的成员进行赋值或存取以及运算。
例如,对上面定义的结构体变量student1,可以这样访问各成员:
student1.numstudent1.birthday.month注意:
不能用student1.birthday来访问student1变量中的成员birthday,因为birthday本身是一个结构体变量。
(3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。
例如:
student2.score=student1.score;sum=student1.score+student2.score;student1.age+;+student1.age;由于“”运算符的优先级最高,因此student1.age+是对student1.age进行自加运算,而不是先对age进行自加运算。
(4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
如:
scanf(%d“,结构体变量的地址主要用于作函数参数,传递结构体的地址。
11.4结构体变量的初始化,例11.1对结构体变量初始化#includevoidmain()structstudentlongintnum;charname20;charsex;charaddr20;a=89031,LiLin,M,123BeijingRoad;printf(NO.:
%ldnname:
%snsex:
%cnaddress:
%sn,a.num,a.name,a.sex,a.addr);,11.5结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。
如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。
结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。
11.5.1定义结构体数组,和定义结构体变量的方法相仿,只需说明其为数组即可。
如:
structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;structstudentstu3;,也可以直接定义一个结构体数组,如:
structstudentintnum;stu3;,或structintnum;stu3;,11.5.2结构体数组的初始化,与其他类型的数组一样,对结构体数组可以初始化。
如:
structstudentintnum;charname20;charsex;intage;floatscore;charadd30;stu3=10101,“LiLin”,M,18,87.5,“103BeijingRoad”,10102,“ZhangFun”,M,19,99,“130ShanghaiRoad”,10104,“WangMin”,F,20,78.5,“1010ZhongshanRoad”;,数组的初始化也可以用以下形式:
structstudentintnum;structstudentstu=,;即先声明结构体类型,然后定义数组为该结构体类型,在定义数组时初始化。
从以上可以看到,结构体数组初始化的一般形式是在定义数组的后面加上:
=初值表列;,11.5.2结构体数组的初始化,11.5.3结构体数组应用举例,例11.2对候选人得票的统计程序。
设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。
#include#includestructpersoncharname20;intcount;leader3=Li,0,Zhang,0,Fang,0;,voidmain()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;printf(n);for(i=0;i3;i+)printf(%5s:
%dn,leaderi.name,leaderi.count);,11.6指向结构体类型数据的指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址。
可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
指针变量也可以用来指向结构体数组中的元素。
11.6.1指向结构体变量的指针下面通过一个简单例子来说明指向结构体变量的指针变量的应用。
#include#includemain()structstudentlongnum;charname20;charsex;floatscore;,structstudentstu_1;structstudent*p;p=,在C语言中,为了使用方便和使之直观,可以把(*p)num改用pnum来代替,它表示*p所指向的结构体变量中的num成员。
同样,(*p).name等价于pname。
也就是说,以下三种形式等价:
结构体变量成员名(*p)成员名p-成员名上面程序中最后一个printf函数中的输出项表列可以改写为p-num,p-name,p-sex,p-score其中-称为指向运算符。
-n得到p指向的结构体变量中的成员n的值。
p-n+得到p指向的结构体变量中的成员n的值,用完该值后使它加1。
+p-n得到p指向的结构体变量中的成员n的值使之加1(先加)。
11.6.2指向结构体数组的指针,以前已经介绍过,可以使用指向数组或数组元素的指针和指针变量。
同样,对结构体数组及其元素也可以用指针或指针变量来指向。
#includestructstudentintnum;charname20;charsex;intage;,structstudentstu3=10101,LiLin,M,18,10102,ZhangFun,M,19,10104,WangMin,F,20;main()structstudent*p;printf(No.Namesexagen);for(p=stu;pnum,p-name,p-sex,p-age);,注意,
(1)如果p的初值为stu,即指向第一个元素,则p加1后p就指向下一个元素的起始地址。
例如:
(+p)-num先使p自加1,然后得到它指向的元素中的num成员值(即10102)。
(p+)-num先得到p-num的值(即10101),然后使p自加1,指向stu1。
(2)程序已定义了p是一个指向structstudent类型数据的指针变量,它用来指向一个structstudent型的数据,不应用来指向stu数组元素中的某一成员。
例如,下面的用法是不对的:
p=stu1.name编译时将给出警告信息,表示地址的类型不匹配。
千万不要认为反正p是存放地址的,可以将任何地址赋给它。
如果地址类型不相同,可以用强制类型转换。
例如:
p=(structstudent*)stu0name;此时,p的值是stu0元素的name成员的起始地址。
可以用“printf(”%s“,p);”输出stu0中成员name的值,但是,p仍保持原来的类型。
执行“printf(%s,p+1);”,则会输出stu1中name的值。
执行p+1时,p的值增加了结构体structstudent的长度。
11.6.3用结构体变量和指向结构体的指针作函数参数,将一个结构体变量的值传递给
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 公用