结构和联合

上传人:jiups****uk12 文档编号:45356483 上传时间:2018-06-16 格式:PPT 页数:41 大小:250KB
返回 下载 相关 举报
结构和联合_第1页
第1页 / 共41页
结构和联合_第2页
第2页 / 共41页
结构和联合_第3页
第3页 / 共41页
结构和联合_第4页
第4页 / 共41页
结构和联合_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《结构和联合》由会员分享,可在线阅读,更多相关《结构和联合(41页珍藏版)》请在金锄头文库上搜索。

1、第8章 结构和联合 本章要点nC语言的结构类型。n结构数组。n指向结构的指针。nC语言的动态数据结构。n联合类型。 本章难点n结构指针和C语言的动态数据结构。 8.1 结构的说明和引用 8.2 结构的指针 8.3 结构和函数 8.4 结构数组 8.5 结构和指针的应用 8.6 联合(共用体) 8.7 用typedef定义类型名 8.1 结构的说明和引用 n在实际中常常描述同一对象的不同属性,如一 个学生有学号、姓名、性别、年龄、各科分数, 表示这些属性的数据具有不同的类型,因而不能 用数组表示。C语言提供了一种数据结构,可以 把这些不同类型的数据组成一个整体,这就是结 构类型。 n结构类型是各

2、种结构的总称,是一种构造类型 。一个结构变量可以由不同类型的成员变量组成 ,这些成员变量又称为结构的域、分量。结构的 所有成员除自身的名字外,还拥有共同的名字, 即结构变量名。8.1.1 结构说明 8.1.2 结构的引用 8.1.1 结构说明 struct 结构体名 数据类型1 成员名1;数据类型2 成员名2;数据类型n 成员名n;结构体类型定义的一般形式: lstruct为关键字;l结构体名是用户定义 的类型标识。l 中是组成该结构体 的成员。成员的数据 类型可以是C语言所允 许的任何数据类型。n在定义结构体类型的同时定义变量例如:struct student char num8,name2

3、0,sex;int age;float score;st30;struct 结构体名 成员定义表;变量名表;n直接定义结构体类型变量 例如:struct char num8,name20,sex;int age;float score;st30, a, b, c;struct 成员定义表;变量名表;n在结构的说明中,结构成员可以为任何 类型且结构成员还可以和结构外部的其它 变量同名,不同结构的成员也可以同名, 但同一结构的成员不能同名。 n例如学生类型的定义: struct student char num8; /* 学号是字符数组类型 */char name30; /* 姓名是字符数组类型

4、*/char sex; /* 性别是字符型 */int age; /* 年龄是整型 */char addr60; /* 住址是字符数组类型 */int score6; /* 成绩是整型数组类型 */;n利用已定义的结构体类型名定义变量struct 结构体名 变量名表; 例如:struct student s30, t1, t2;按照结构体类型的组成,系统为定义的结构体 变量分配内存单元。结构体变量的各个成员在内存 中占用连续存储区域,结构体变量所占内存大小大小为为 结构体中每个成员所占用内存的长度之和。struct studentnum8个字节name30个字节sex1个字节 age4个字节

5、addr60个字节 score24个字节8.1.2 结构的引用 1结构的初始化结构变量在说明时可以初始化,初值是由常 量表达式组成的初值表。例如, struct studentchar name10; short sex;int age;float score; student1“zhangsan”,1,20,88.8; 2结构变量的引用 对结构变量的引用只允许下列5种情况: (1)同类型的结构变量相互赋值。例如student2=student1; (2)函数返回的结构成员给同类型的结构变量 。 (3)对结构变量取地址。例如 student.sex=0; scanf(“%s”,student1

6、.name); 但student1.name=”zhang san”; 则为非法。 4嵌套的结构结构的一个成员可以是一个结构,含 有结构成员的结构称为嵌套的结构。 struct date int year,month,day;struct student char num8;char name30;char sex;struct datestruct date birthday; /* 成员为结构体类型 */char addr60;int score6;num8个字节name30个字节sex1个字节 birthdayyear2个字节month2个字节day2个字节addr60个字节score1

7、2个字节例:输入三个人的信息,求其总成绩。n#include nvoid main()nstruct studn char name20;n int age;n char sfzh20;n float zcj;na,b,c;n float zcj;n printf(“请输入第一个人的信息:name,age,sfzh,zcj:n“);nscanf(“%s %d %s %f“,a.name,nprintf(“请输入第二个人的信息:name,age,sfzh,zcj:n“);nscanf(“%s %d %s %f“,c.name,nprintf(“请输入第三个人的信息:name,age,sfzh,z

8、cj:n“);nscanf(“%s %d %s %f“,c.name,nprintf(“第一个人的信息是:“);nprintf(“%s %d %s %f“,a.name,a.age,a.sfzh,a.zcj);n zcj=a.zcj+b.zcj+c.zcj;nprintf(“总成绩:%fn“,zcj);n8.2 结构的指针 n 指向结构的指针(或称结构指针)可以 用来引用结构的成员,可以作为参数传给 函数,也可以作为函数的返回值。 1结构指针的说明指向结构的指针使用之前也要进行说明 ,例如 struct date int year, month, day;d, *p=n用结构体变量名的引用形式

9、:d.year d.month d.day 用结构体指针变量的引用形式:(*p).year (*p).month (*p).dayp-year p-month p-day注意:成员引用表达式中的( )不能省,如(*pd).day 不能写成*pd.day,因为“.”运算符的优先级高于*,所 以*pd.day等同于*(pd.day),在该例中为非法操作。结构成员运算符“-”和“.”的优先级相同,它们 与()、 属于同一优先级,按从左到右结合。8.3 结构和函数 1结构作函数的参数 结构作函数的参数有三种可能的方法。 (1)传一个结构成员(用结构成员作实参); (2)传整个结构(用结构变量名作实参)

10、; (3)传结构的指针(用结构的地址或指向结构 的指针作实参)。 我们推荐使用第三种方法。 函数的返回值为结构变量或指向结构变量的指针 。 已定义在comp.h中。 struct complex float re; /*实部*/ float im; /*虚部*/ ;【例8.3】写一个函数计算两个复数的和。 #include “comp.h“ struct complex *addcomp(struct complex c1, struct complex c2) static struct complex temp; temp.re=c1.re+c2.re; temp.im=c1.im+c2.

11、im; return( 8.4 结构数组8.4.1 结构数组的说明,引用和初始化 8.4.2 结构数组作函数参数 8.4.3 sizeof运算符 8.4.4 用结构的指针引用结构数组的成员8.4.1 结构数组的说明、引用和初始化结构数组是其元素都是具有相同结构 体类型的结构体变量。定义的一般格式为 :struct 结构体名 结构体数组名元素 个数,结构体数组名元素个数,;其中,“struct 结构体名”是已定义 过的结构体类型。因此定义结构体数组和 定义结构体变量的方法相仿,只需说明其 为数组即可。例如: struct student int num;char name10;char sex;

12、int age;float score;char addr30; ; struct student stu3;以上定义了一个数组stu,其元素为struct student类型数据,数组有3个元素。2、结构体数组的初始化一个外部的或静态的结构体数组在定义的同 时可以初始化。其一般格式是在定义之后紧跟一 个用花括号括起来的一组初始化数据:struct 结构体名 结构体数组名=初始数 据表列;其中,“struct 结构体名”是已定义过的 结构体类型。 【例8.6】对候选人得票的统计程序。设有三个 侯选人,每次输入一个得票的候选人的名字,要 求最后输出各人得票结果。 #include #includ

13、e “string.h” struct person char name18;int count; leader3=“Li“,0,“Zhang“,0,“Wang“,0;void main () int i,j; char leader_name18; for(i=1;ii, p-name, p-w);tab数组 1 Htab0 1.008 2 Hetab1 4.0026 3 Litab2 6.941 4 Betab3 9.01218pppppNo Name Atomic WeightNo Name Atomic Weight 1 H 1.008 2 He 4.0026 3 Li 6.941 4

14、 Be 9.01218链表是一种动态数据结构,可根据需要 动态地分配存储单元。在数组中,插入或删 除一个元素都比较繁琐,而用链表则相对容 易。但是数组元素的引用比较简单,对于链 表中结点数据的存取操作则相对复杂。 链表中每个元素称为一个结点。 构成链表的结点必须是结构体类型数据。head 1000 1032 3284 1296 1382 2008动态单向链表示意图C3284H1296A1382I2008NNULL10001032 相邻结点的地址不一定是连续的,依靠指针将它们连接起来。struct node char c;struct node *next; ;8.5 结构指针的应用C语语言提供

15、了相关的存储储管理库库函数。这这里 仅仅介绍绍其中三个,它们们的原型说说明在 “stdlib.h”头头文件和“malloc.h”头头文件中,使用 这这三个函数时时,应选择应选择 其中一个头头文件包含 到源程序中。 动态分配存储区函数malloc( )函数原型:void *malloc(unsigned size);调用格式:malloc(size)功能:在内存分配一个size字节的存储区。调 用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。在ANSI C标准中,关键字void有两种用法。 第一种用法,可将无返回值的函数定义为void类型 第二种用法,用void * 定义指针,这是一个指向 非具体数据类型的指针,称为无类型指针。 动态分配和释放存储单元【例】调用mal

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号