第10章结构、联合与枚举类型.ppt
《第10章结构、联合与枚举类型.ppt》由会员分享,可在线阅读,更多相关《第10章结构、联合与枚举类型.ppt(83页珍藏版)》请在三一办公上搜索。
1、结构、联合与枚举类型,第十章,第一节 结构类型第二节 结构数组第三节 结构指针第四节 在函数之间传递结构第五节 联合类型第六节 枚举类型第七节 用typedef定义类型第八节 链表基础第九节 举例,问题的引出 用学号、姓名、性别、年龄、住址等属性来描述一个学生。int num;char name20;char sex;int age;char addr30;问题一:在程序中这些变量没有的内在联系。问题二:如果有很多的学生,就可能造成混乱。,一、结构类型的概念,第一节 结构类型,这些数据存放在内存的某个区域。将此区域统一来使用,形成了结构体的概念。结构是逻辑上相互联系的一组分量的集合。结构中的分
2、量可以有不同的类型数据,结构中的分量称为结构的成员。,第一节 结构类型,比较简单数据类型时的变量说明语句:int i;,struct 结构体名 数据类型 成员名;数据类型 成员名;数据类型 成员名;;,二、结构类型的定义,struct为关键字结构体名是用户定义的类型标识。中包围的是组成该结构的成员。,成员的数据类型既可以是简单的数据类型(int、char、float、double.),也可以是复杂的数据类型(数组类型和结构类型)。,第一节 结构类型,结构定义实例为了描述日期可以定义如下结构:struct date int year;/*年 结构成员的*/int month;/*月 数据类型是*
3、/int day;/*日 整型*/;为了处理通信录,可以定义如下结构:struct address char name30;/*姓名。字符数组*/char street40;/*街道名称*/char city20;/*城市*/char state2;/*省市代码*/unsigned long zip;/*邮政编码。*/;,第一节 结构类型,在定义了某种类型的结构体后,就可以使用该类型的结构变量。用类型说明语句说明结构变量 struct 结构体名 结构变量名;系统为所说明的结构变量按照结构定义时说明的组成(成员分量),分配存储数据的实际内存单元。例:将变量today说明为date型的结构变量:s
4、truct date today;说明多个address型的结构变量:struct address wang,li,zhang;结构变量同样有存储类型,存储特性与一般变量完全相同。,三、结构变量的说明,第一节 结构类型,结构变量占用内存情况 结构变量的各个成员分量在内存中占用连续存储区域,所占内存大小为结构中每个成员的占用内存的长度之和。结构变量today和wang占用在内存的情况如图所示。,第一节 结构类型,关于结构类型的说明类型与变量是不同的概念。在定义结构变量时一般先定义一个结构类型,然后 定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是
5、不分配空间的,只对变量分配空间。对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员也可以是结构变量。成员名可以与程序中的变量名相同时,二者不代表同一对象。,第一节 结构类型,在定义结构时说明结构变量例如:struct student int num;char name20;char sex;int age;char addr30;student1,student2;直接说明结构变量例如:struct char name20;char addr30;zhang;,第一节 结构类型,结构成员是另一个结构例如:struct dateint month;int day;int year;
6、struct studentint num;char name20;char sex;int age;struct date birthday;char addr30;student1,student2;,birthday,birthday,birthday,birthday,第一节 结构类型,访问结构中的成员是通过成员的名字,称为“按名引用”。在程序中使用结构中成员的方法为:结构变量名.成员名称例:将“92.10.01”送入today,对其各个成员分别赋值:today.year=92;today.month=10;today.day=1;指明结构成员的符号“.”是运算符,含义是访问结构中的成
7、员。“.”操作的优先级在语言中是最高的。其结合性为从左到右。,四、引用结构变量的成员,第一节 结构类型,例:用结构描述一个人的基本情况,可以定义如下结构:struct person/*定义person结构类型*/char name30;char sex;struct date birthday;/*结构的嵌套定义*/man;,第一节 结构类型,输入zhang先生的情况,可用如下语句:strcpy(man.name,“zhang”);/*注意:不能写成man.name=zhang;*/man.sex=M;/*为结构中的字符成员赋值*/man.birthday.year=1960;man.birt
8、hday.month=3;man.birthday.day=28;/*为嵌套定义的结构中的成员赋值*/,第一节 结构类型,如果要将“zhang”改为“zhong”,只要将结构变量man中的数组成员name下标为2的元素a改为o即可。可以使用下列语句:man.name2=o;/*为结构变量中的数组成员的一个元素赋值*/,第一节 结构类型,五、对结构变量的整体操作,要对结构进行整体操作有很多限制,语言中能够对结构进行整体操作的运算不多,只有赋值“”和取地址“”操作。例如:有 struct date sunday,today;如果today被赋值后,可用语句 sunday=today;为sunday
9、赋值。,第一节 结构类型,结构类型的引用说明不能将一个结构变量作为一个整体直接访问。例如已定义student1为结构变量并且已有值。不能这样引用:printf(“%s,%c,%d,%d,%dn”,student1);如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取等运算。例如,对上面定义的结构变量student1,可以这样访问各个成员:student1.namestudent1.sexstudent1.birthday.monthstudent1.birthday.daystudent1.birthday.year,第一节
10、结构类型,对成员变量可以象普通变量一样进行各种运算。student2.birthday.year=student1.birthday.year;sum=student1.birthday.month+12;student1.age+;+student1.age;,第一节 结构类型,可以引用成员的地址,也可以引用结构变量的地址。如:scanf(“%d”,第一节 结构类型,例:输入今天的日期,然后输出该日期。#include main()struct date/*在函数中定义结构类型date*/int year,month,day;struct date today;/*说明结构变量today*/
11、printf(Enter today date(YYYY/MM/DD):);scanf(%d/%d/%d,例C10_103,第一节 结构类型,对结构变量进行初始化在说明变量的同时,可以对每个成员置初值,称为结构变量的初始化,其一般形式为:定义结构时说明变量 struct 结构体名 结构变量=初始化数据;类型说明语句struct 结构体名 结构变量=初始化数据;说明:中的初始化数据用逗号分隔。注意数据的个数、数据类型、顺序要一一对应。,六、结构变量的初始化,第一节 结构类型,例:用结构描述个人基本情况,打印个人档案。struct date/*在所有函数的外部定义结构date*/int year,
12、month,day;struct person/*在所有函数的外部定义结构person*/char name14,sex;struct date birthday;struct person xu=Xu lihui,M,1962,10,4;main()struct person fang=Fang jin,M,1963,9,13;struct person yuan=Yuan zhiping,M,1963,10,5;/*说明结构变量fang、yuan,并初始化结构变量*/,第一节 结构类型,printf(name sex birthdayn);printf(-n);printf(%-14s%-
13、4c%4d.%2d.%2dn,xu.name,xu.sex,xu.birthday.year,xu.birthday.month,xu.birthday.day);printf(%-14s%-4c%4d.%2d.%2dn,fang.name,fang.sex,fang.birthday.year,fang.birthday.month,fang.birthday.day);printf(%-14s%-4c%4d.%2d.%2dn,yuan.name,yuan.sex,yuan.birthday.year,yuan.birthday.month,yuan.birthday.day);,例C10_
14、104,第一节 结构类型,结构体数组说明语句的格式,对结构体数组的认识是一个数组。数组中的每一个元素的数据类型是结构类型。例:为记录100个人的基本情况。可以说明一个有100个元素的数组。数组元素的基类型为结构。struct person man100;man就是有100个元素的结构数组,数组的每个元素为 person 型。,标识符数组长度,struct 结构体名,第二节 结构数组,访问结构数组元素成员 必须遵守数组使用和访问结构成员的规定。访问数组元素 按下标进行访问。访问数组元素的成员,使用“.”运算符和成员名。例如:要将数组man中的 3号元素赋值为:Fangjin,M,1963,9,1
15、3,就可以使用下列语句:strcpy(man3.name,Fangjin”);man3.sex=M;man3.birthday.year=1963;man3.birthday.month=9;man3.birthday.day=13;,第二节 结构数组,将“Fangjin”改为“Fangjun”,修改其中的字母i:man3.name5=u;/*为数组中元素的数组成员中的一个字符赋值*/注意结构数组遵循数组的性质数组元素的起始下标从0开始,数组名表示该结构数组的存储首地址。结构数组存放在连续的内存区域中,所占内存大小为结构类型的大小乘以数组元素的数量。sizeof(struct person),
16、struct person man100长度=37*100=3700 字节,?,第二节 结构数组,例:简单的密码加密程序。加密过程是先定义一张字母加密对照表。将需要加密的文字输入加密程序,程序根据加密表中的对应关系,将输入的文字加密输出。对加密表中未出现的字符则不加密。输入 输出 输入 输出 输入 输出 输入 输出 输入 输出 a d b w c k d;e i i a k b;c w estruct table/*定义结构table*/char input;/*成员input存输入的字符*/char output;/*成员output存输出的字符*/;/*外部结构数组translate并初始
17、化*/struct table translate=a,d,b,w,c,k,d,;,e,i,i,a,k,b,;,c,w,e;/*建立加密对照表*/,第二节 结构数组,“struct table translate=.”有三个作用:说明了一个外部的结构数组translate,表示数组的大小由后面给出的初始化数据决定,对结构数组进行初始化。在程序中给出了数组初始化数据,所以结构数组translate有9个元素。,第二节 结构数组,struct table char input,output;struct table translate=a,d,b,w,c,k,d,;,e,i,i,a,k,b,;,c
18、,w,e;main()char ch;int str_long,i;str_long=sizeof(translate)/sizeof(struct table);/*计算元素个数*/while(ch=getchar()!=n)for(i=0;translatei.input!=ch/*原样输出*/,例C10_201,第二节 结构数组,例:分析程序运行结果struct s int x;int*y;/*y:是指向整型的指针*/int data5=10,20,30,40,50;/*data:整型数组*/struct s array5=100,/*array:结构数组,初始化*/结构数组array的
19、每个元素有两个成员,初始化后的状态如下。,第二节 结构数组,main()int i=0;/*说明变量i并赋初值*/struct s s_var;/*s_ver:一般的结构变量*/s_var=array0;/*将结构数组array0整体赋给s_var*/printf(%dn,s_var.x);printf(%dn,*s_var.y);printf(For array:n);printf(%dn,arrayi.x);printf(%dn,*arrayi.y);printf(%dn,+arrayi.x);printf(%dn,+*arrayi.y);printf(%dn,array+i.x);pri
20、ntf(%dn,*+arrayi.y);printf(%dn,(*arrayi.y)+);printf(%dn,*(arrayi.y+);printf(%dn,*arrayi.y+);printf(%dn,*arrayi.y);,第二节 结构数组,(i=0):s_var=array0;,100,10,100,s_var.x 取s_var的成员x的值*s_var.y 取s_var的成员指针y所指的内容,arrayi.x 取arrayi的x的值*arrayi.y 取arrayi的指针y所指的内容,10,10,100 10,100 10,第二节 结构数组,+arrayi.x 取arrayi的x的值,
21、x加1后输出+*arrayi.y 取arrayi的指针y所指的内容,y的内容加1后输出,100,101,10,11,1,200,30,array+i.x i先加1后取arrayi的x的值,输出*+arrayi.y 将arrayi的指针y先加1后再取y所 指的内容,输出,101 11,200 30,第二节 结构数组,(*arrayi.y)+取arrayi的指针y的内容,输 出,y的内容再加1*(arrayi.y+)取arrayi的指针y的内容,输 出,指针y再加1,30,31,40,50,*arrayi.y+同*(arrayi.y+),由于运 算的结合性隐含了括号,输出*arrayi.y 输出,
22、例C10_202,30 31,40 50,第二节 结构数组,类似于指向基本数据类型的指针的概念,将结构体变量的地址赋给另一个变量,这就是指向结构体的指针(简称为结构指针)。结构指针说明的一般形式struct 结构体名*标识符;例如:struct date*pdate,today;执行语句:pdate=结果:,一、结构指针的概念,第三节 结构指针,通过结构指针访问成员采用运算符“-”进行操作。结构指针-成员名“-”运算符有最高的优先级,结合性从左至右。通过结构指针pdate访问成员year的操作就可以写成:pdate-year=1963;等价于:today.year=1963;(*pdate).
23、year=1963;辨疑:pdate-year*pdate-year,二、通过结构指针访问结构体的成员,例C10_301,第三节 结构指针,例:用结构指针改写加密程序struct tablechar input,output;struct table transl=a,d,b,w,c,k,d,;,e,i,i,a,k,b,;,c,w,e,;main()char ch;struct table*p,*pend;/*p和pend为向结构指针*/pend=,第三节 结构指针,例.C:请分析程序的运算结果struct sint x,*y;/*y:结构中的成员是指向整型的指针*/*p;/*p:指向结构的指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 结构 联合 枚举 类型
链接地址:https://www.31ppt.com/p-5889015.html