第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; /* 年
3、 结构成员的 */ int month; /* 月 数据类型是 */ int day; /* 日 整型 */ ; 为了处理通信录,可以定义如下结构: struct address char name30; /* 姓名。字符数组 */ char street40; /* 街道名称 */ char city20; /* 城市 */ char state2; /* 省市代码 */ unsigned long zip; /* 邮政编码。 */ ;,第一节 结构类型,在定义了某种类型的结构体后,就可以使用该类型的结构变量。 用类型说明语句说明结构变量 struct 结构体名 结构变量名; 系统为所说明的
4、结构变量按照结构定义时说明的组成(成员分量),分配存储数据的实际内存单元。 例:将变量today说明为date型的结构变量: struct 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 n
6、ame20; char addr30; zhang;,第一节 结构类型,结构成员是另一个结构 例如:struct date int month; int day; int year; ; struct student int num; char name20; char sex; int age; struct date birthday; char addr30; student1,student2;,birthday,birthday,birthday,birthday,第一节 结构类型,访问结构中的成员是通过成员的名字,称为“按名引用”。在程序中使用结构中成员的方法为: 结构变量名.成员
7、名称 例:将“92.10.01”送入today,对其各个成员分别赋值: today.year = 92; today.month = 10; today.day = 1; 指明结构成员的符号“.”是运算符,含义是访问结构中的成员。“.”操作的优先级在语言中是最高的。其结合性为从左到右。,四、引用结构变量的成员,第一节 结构类型,例:用结构描述一个人的基本情况,可以定义如下结构: struct person /* 定义person结构类型 */ char name30; char sex; struct date birthday; /* 结构的嵌套定义 */ man;,第一节 结构类型,输入z
8、hang先生的情况,可用如下语句: strcpy(man.name,“zhang”); /*注意:不能写成man.name=“zhang“; */ man.sex = M; /* 为结构中的字符成员赋值 */ man.birthday.year = 1960; man.birthday.month = 3; man.birthday.day = 28; /* 为嵌套定义的结构中的成员赋值 */,第一节 结构类型,如果要将“zhang”改为“zhong”,只要将结构变量man中的数组成员name下标为2的元素a改为o即可。可以使用下列语句: man.name2=o; /* 为结构变量中的数组成员
9、的一个元素赋值 */,第一节 结构类型,五、对结构变量的整体操作,要对结构进行整体操作有很多限制,语言中能够对结构进行整体操作的运算不多,只有赋值“”和取地址“”操作。 例如:有 struct date sunday, today; 如果today被赋值后,可用语句 sunday=today; 为sunday赋值。,第一节 结构类型,结构类型的引用说明 不能将一个结构变量作为一个整体直接访问。例如已定义student1为结构变量并且已有值。不能这样引用: printf(“%s,%c,%d,%d,%dn”,student1); 如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到
10、最低的一级的成员。只能对最低级的成员进行赋值或存取等运算。例如,对上面定义的结构变量student1,可以这样访问各个成员: student1.name student1.sex student1.birthday.month student1.birthday.day student1.birthday.year,第一节 结构类型,对成员变量可以象普通变量一样进行各种运算。 student2.birthday.year=student1.birthday.year; sum = student1.birthday.month + 12; student1.age+; +student1.ag
11、e;,第一节 结构类型,可以引用成员的地址,也可以引用结构变量的地址。如: scanf(“%d”,第一节 结构类型,例:输入今天的日期,然后输出该日期。 #include main( ) struct date /* 在函数中定义结构类型date */ int year, month, day; ; struct date today; /* 说明结构变量today */ printf (“Enter today date(YYYY/MM/DD):“); scanf(“%d/%d/%d“, ,例C10_103,第一节 结构类型,对结构变量进行初始化 在说明变量的同时,可以对每个成员置初值,称为
12、结构变量的初始化,其一般形式为: 定义结构时说明变量 struct 结构体名 结构变量= 初始化数据 ; 类型说明语句 struct 结构体名 结构变量 = 初始化数据 ; 说明: 中的初始化数据用逗号分隔。注意数据的个数、数据类型、顺序要一一对应。,六、结构变量的初始化,第一节 结构类型,例:用结构描述个人基本情况,打印个人档案。 struct date /* 在所有函数的外部定义结构date */ int year, month, day; struct person /* 在所有函数的外部定义结构person */ char name14, sex; struct date birthd
13、ay; ; 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 %-4c%4d.%2d.%2dn“, xu.name, xu.sex,xu.birthday.year,
14、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_104,第一节 结构类型,结构体数组说明语句的格式,对结构体数组
15、的认识 是一个数组。 数组中的每一个元素的数据类型是结构类型。 例:为记录100个人的基本情况。可以说明一个有100个元素的数组。数组元素的基类型为结构。 struct person man100; man就是有100个元素的结构数组,数组的每个元素为 person 型。,标识符数组长度,struct 结构体名,第二节 结构数组,访问结构数组元素成员 必须遵守数组使用和访问结构成员的规定。 访问数组元素 按下标进行访问。 访问数组元素的成员,使用“.”运算符和成员名。 例如:要将数组man中的 3号元素赋值为: “Fangjin“,M,1963,9,13, 就可以使用下列语句: strcpy(
16、 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),stru
17、ct person man100长度 = 37 * 100 = 3700 字节,?,第二节 结构数组,例:简单的密码加密程序。 加密过程是先定义一张字母加密对照表。将需要加密的文字输入加密程序,程序根据加密表中的对应关系,将输入的文字加密输出。对加密表中未出现的字符则不加密。 输入 输出 输入 输出 输入 输出 输入 输出 输入 输出 a d b w c k d ; e i i a k b ; c w e struct table /* 定义结构table */ char input; /* 成员input存输入的字符 */ char output; /* 成员output存输出的字符*/ ;
18、 /*外部结构数组translate并初始化*/ 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 tra
19、nslate = a,d,b,w,c,k, d,;,e,i,i,a, k,b,;,c,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
20、,30,40,50; /* data:整型数组 */ struct s array5=100, /* array: 结构数组,初始化 */ 结构数组array的每个元素有两个成员,初始化后的状态如下。,第二节 结构数组,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“); print
21、f(“%dn“, arrayi.x); printf(“%dn“, *arrayi.y); printf(“%dn“, +arrayi.x); printf(“%dn“, + *arrayi.y); printf(“%dn“, array+i.x); printf(“%dn“, * + arrayi.y); printf(“%dn“,(* arrayi.y) +); printf(“%dn“, * (arrayi.y +); printf(“%dn“, * arrayi.y +); printf(“%dn“, * arrayi.y); ,第二节 结构数组,(i=0): s_var = arra
22、y0;,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的值,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后
23、再取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 输出,例C10_202,30 31,40 50,第二节 结构数组,类似于指向基本数据类型的指针的概念,将结构体变量的地址赋给另一个变量,这就是指向结构体的指针(简称为结构指针)。 结构指针说明的一般形式 struct 结构体名 *
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 结构 联合 枚举 类型
链接地址:https://www.31doc.com/p-2250709.html