《C语言与程序设计教程》课件第7章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《C语言与程序设计教程》课件第7章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言与程序设计教程 语言 程序设计 教程 课件
- 资源描述:
-
1、第第7章章 结构体结构体 7.1 结构体类型定义与结构体变量7.2 结构体数组及指向结构体的指针变量7.3 链表 7.4 共用体7.5 典型例题精讲 7.1 结构体类型定义与结构体变量结构体类型定义与结构体变量7.1.1 结构体类型的定义结构体类型的定义在数据的处理中,一组数据往往具有不同的数据类型。例如在学生登记表中,姓名为字符数组型,年龄为整型,性别为字符型,而成绩可为整型或实型;显然不能使用一个数组来存放这组数据,因为数组中各元素的类型必须一致。为了解决这个问题,C语言给出了一种新的构造数据类型结构体类型,它相当于其他高级语言中的记录类型。结构体类型是一种构造类型,即将其他数据类型组合在
2、一起构造成一个结构体类型。因此,结构体类型是由若干成员组成的,每一个成员可有不同的名字及数据类型。与数组类似的是,结构体也是一些相关数据的集合;但与数组不同的是,结构体中各成员的数据类型可以不同。结构体类型既然是一种构造类型,也即C语言并无像int等类型那样事先构造好的结构体类型,因此在使用之前必须先定义结构体类型,然后才可能像int等类型一样,用该结构体类型来定义所需要的结构体变量。一个结构体类型定义的一般形式为:struct 结构体名结构体成员表;其中,struct是关键字,称为结构体定义标识符,结构体名是结构体类型标志,struct与结构体名一起构成了一个新的类型名。花括号“”内的结构体
3、成员表由若干个成员组成,每个成员都是该结构体的一个组成部分,并且对每个成员必须进行类型说明,其形式为:类型标识符 成员名;结构体名和成员名的命名应符合标识符的书写规定。例如,描述学生登记表的结构体类型定义如下:struct studentchar name20;int age;char sex;int math,phys,english;float average;其中,student是一个自定义的结构体名,它与struct一起构成了一个新的类型名(准确地说是一个新的结构体类型名)。此后就可以像使用int、char和float等简单类型名一样使用struct student这一新类型名了,而n
4、ame、age、sex、math、phys、english和average则是该结构体中的成员。在以往的变量定义中,各个变量之间彼此相互独立,没有任何内在的联系。而结构体类型却不同,如上述结构体类型定义就包含着name、age、sex等各项内容,这些内容共同表达了一个学生的有关信息。结构体类型定义时用花括号“”将这些彼此有关的变量(即每一个结构体成员)括起来,表示它们之间存在着联系。所以,结构体类型可以看做是对彼此相关变量的一种定义。结构体类型定义从另一个角度来说类同于表格的描述,表格中的各项都有自己的名字,每项内容都可以归到某种数据类型下。在结构体类型定义中则表现为:表格中的每一项都对应结构
5、体中的一个成员,并且各个成员的数据类型可以不同。结构体类型定义实质上是将一张表格的各项内容转化为结构体成员来描述的,而结构体类型定义中的花括号“”则相当于一张表格的开始和结束。例如,上述结构体类型定义与学生登记表表格的对照如图7-1所示。图7-1 表格与结构体类型定义对照定义结构体类型时应注意以下几点:(1)结构体类型定义与其他变量的定义一样,也是用一条说明语句实现。因此必须用分号“;”标识语句的结束,也就是说结构体类型定义时在花括号“”之后要有分号“;”这一点与复合语句的花括号“”后无分号“;”是不同的。(2)结构体成员可以是任何一种基本数据类型的变量,也可以是指针变量或者像数组这样的构造类
6、型变量。由于结构体成员可以是一个构造类型变量,那么它当然也可以是一个结构体类型变量,从而形成结构体类型的嵌套定义。例如:struct studentchar name20;int age;char sex;struct dateint year,mouth,day;birthday;int math,phys,english;float average;在此,结构体成员birthday变量的类型又属于结构体类型struct date。也可以采用下面的形式进行定义:struct dateint year,mouth,day;struct student char name20;int age;c
7、har sex;struct date birthday;int math,phys,english;float average;(3)结构体类型的定义除指针外不允许递归定义。例如:struct stuchar name10;int score;struct stu a;在结构体类型struct stu的定义中,又定义了一个类型为struct stu的成员a,这种定义方式是错误的。但可以在结构体类型的定义中,用结构体类型来定义一个指向该结构体类型变量的指针变量。例如:struct nodechar ch;struct node*next;在结构体类型struct node的定义中,用结构体类型
8、struct node定义了一个指针变量next(next可以指向类型为struct node类型的变量);这种定义方式是正确的。(4)同一结构体内的各成员名不能相同;在结构体类型嵌套定义中,不同层的成员名可以相同;此外,结构体成员名也可以与普通变量同名。7.1.2 结构体变量结构体变量1.结构体变量的定义定义了一个结构体类型,只是描述了该结构体的组织形式:有几个成员,每个成员具有什么类型。这个结构体类型就象int类型一样,仅表明又多了一种可以使用的数据类型。要注意的是,就如同int是类型不是变量一样,结构体类型本身也不是结构体变量,因此系统并不为结构体类型分配存储空间。只有在依据结构体类型定
9、义了一个结构体变量之后,系统才为这个结构体变量分配存储空间(即为该结构体变量的每一个成员分配对应的存储空间);这样,才能够在程序中使用这个结构体变量。一个结构体变量的定义可以采用下面三种方法:(1)定义了结构体类型后再定义结构体变量。一般形式为:struct 结构体名结构体成员表;struct 结构体名 变量名列表;例如:struct studentchar name20;int age;char sex;float score;struct student stu1,stu2;这里,“struct student”表示类型名,而stu1和stu2则是类型为“struct student”的结
10、构体变量。(2)定义结构体类型的同时定义该类型的结构体变量。一般形式为:struct 结构体名结构体成员表;变量名列表;例如:struct student char name20;int age;char sex;float score;stu1,stu2;(3)缺省结构体名的直接定义结构体变量。一般形式为:struct结构体成员表;变量名列表;例如:struct char name20;int age;char sex;float score;stu1,stu2;第(3)种方法与第(2)种方法的区别在于省去了结构体名,因此也就不存在这个结构体类型的名字。如果需要在程序的其他地方再定义这种结构
11、体类型变量时,则因无结构体类型名而不能定义。而第(1)种和第(2)种方法在程序的任何地方都可以通过结构体类型名struct student去定义新的结构体变量。上述三种方法对结构体变量stu1分配的存储空间分配示意如图7-2所示。图7-2 结构体变量stu1内存分配示意下面嵌套形式结构体类型所定义的变量stu1、stu2,其stu1存储空间分配示意如图7-3所示。struct studentchar name20;int age;char sex;struct int year,mouth,day;birthday;float average;图7-3 嵌套形式下结构体变量stu1内存分配示意
12、2.结构体变量的初始化结构体变量初始化的一般形式为:结构体类型 结构体变量名=初始化值表;初始化值表给出的初始值将依次赋给结构体变量中顺序出现的每一个成员,给出的初始化数据必须与这个数据的成员类型一致,且个数不得多于结构体变量中的成员个数;如果提供的初始值项数少于成员个数,则与数组类似,没有赋值的成员自动初始化为0值。如果定义时没有给结构体变量提供初始值,则系统对结构体变量的处理与普通变量一样,外部和全局变量用0初始化;局部变量不初始化,故其各成员的值不确定。结构体变量的初始化也有如下两种方式:(1)定义结构体类型之后,在进行结构体变量定义时的初始化。例如:struct studentchar
13、 name20;int age;char sex;float score;struct student stu1=Li min,21,M,86(2)在定义结构体类型的同时定义结构体变量并初始化。例如:struct studentchar name20;int age;char sex;float score;stu1=Li min,21,M,86,stu2=Wang fang,20,F,82;3.结构体变量的引用一般情况下,不能将一个结构体变量作为一个整体来引用,而只能引用其中的成员;包括赋值、运算、输入和输出等都是通过结构体变量的成员来实现的。结构体变量中成员引用的一般形式为:结构体变量名.
14、成员名其中,“.”是结构体成员运算符,其优先级最高,结合性自左而右。通过成员运算符“.”就可以像引用简单变量一样引用结构体变量的每一个成员。注意,对结构体变量中的成员,可以像同类型的普通变量那样进行各种运算和操作。对结构体变量成员的引用,不能直接使用成员名,而是采用“由整体到局部”的层次方式,即先指明是哪个结构体变量,然后再通过成员运算符“.”指定某个成员,并且必须逐层找到最低层的成员才能使用。例如:struct student s1,s2;/*假定结构体类型定义同前,在此仅定义结构体变量*/scanf(%s,s1.name);/*输入姓名*/scanf(%f,&s1.score);/*输入成
15、绩*/printf(name=%s,score=%fn,s1.name,s1.score);/*输出姓名和成绩*/我们知道,一般情况下不能整体引用一个结构体变量,而只能引用其中的成员;但下面两种情况下可以对结构体变量赋值:(1)给结构体变量整体赋值。例如:struct student s1=Li min,21,M,86,s2;s2=s1;(2)取结构体变量地址。例如:struct student*p,s1=Li min,21,M,86;p=&s1;注意,结构体变量名是一个地址常量,其含义与数组名相同,但不能对结构体变量做整体运算和输入,输出。例7.1 给结构体变量赋值并输出其值。解 程序如下:
16、#includevoid main()struct studentchar name20;int age;char sex;float score;stu1,stu2;printf(Input name,age,sex,score:n);scanf(%s,%d,%c,%f,stu1.name,&stu1.age,&stu1.sex,&stu1.score);printf(Output:n);printf(name=%s,age=%dn,stu1.name,stu1.age);printf(sex=%c,score=%fn,stu1.sex,stu1.score);运行结果:Input name
17、,age,sex,score:ZhangHua,21,M,85Output:name=ZhangHua,age=21sex=M,score=85.000000例7.2 有以下程序:#includevoid main()struct STUchar name9;char sex;float score2;struct STU a=Zhao,m,85.0,90.0,b=Qian,f,95.0,92.0;b=a;printf(%s,%c,%2.0f,%2.0fn,b.name,b.sex,b.score0,b.score1);程序运行的结果是 。A)Qian,f,95,92 B)Qian,m,85,
18、90C)Zhao,f,95,92 D)Zhao,m,85,90 解 本题定义并初始化了两个STU结构体变量,由于相同类型的结构体变量可以直接整体赋值,因此,执行语句“b=a;”后,结构体变量b的内容已全部是结构体变量a中的内容,最后逐个输出b变量中各成员的值,实际上就是初始化时a的内容,故选D。例7.3 有以下程序:#includestruct Sint n;int a20;void f(int*a,int n);void main()int i;struct S s1=10,2,3,1,6,8,7,5,4,10,9;f(s1.a,s1.n);for(i=0;is1.n;i+)printf(%
19、d,s1.ai);void f(int*a,int n)int i;for(i=0;in-1;i+)ai=ai+i;程序运行的结果是 。A)2,4,3,9,12,12,11,11,18,9,B)3,4,2,7,9,8,6,5,11,10,C)2,3,1,6,8,7,5,4,10,9,D)1,2,3,6,8,7,5,4,10,9,解 程序在调用函数f时,是将结构体变量s中的成员a数组的数组名a(a数组的首地址)传给了函数f的形参指针变量a,即这个形参指针变量a指向a数组的起始地址;同时将s中的另一成员n(其值为10)传给了函数f的另一形参n。函数f的功能是对形参指针变量a所指的数组元素a0an-
20、2分别自增08;即执行函数f后实现了对数组a中的a0a8元素分别自增08,因此结果选A。7.1.3 用用typedef定义类型标识符定义类型标识符在定义结构体变量时,由于定义过于麻烦,所以往往会出现这样的错误,如将“struct student stu1,stu2;”写成:struct stu1,stu2;或者student stu1,stu2;这都是受到形如“int a,b;”这种简单变量定义的影响;能否像简单变量那样定义结构体变量呢?C语言提供了这种方法,即允许用户自己定义新的类型标识符;也就是说,允许由用户为数据类型取“别名”,它是通过类型定义符typedef来实现的。typedef定义
21、的一般形式为:typedef 原类型名 新类型名;使用typedef时应注意以下两点:(1)typedef可以定义新的类型名,但不能用来定义变量。(2)typedef可以对已经存在的类型增加一个新的类型标识符(即同时存在两个类型名)。1.用typedef定义结构体类型标识符用typedef定义结构体类型标识符的方法有两种:(1)重新命名已有的结构体类型标识符。例如:struct studentchar name20;int age;char sex;float score;此时已有结构体类型标识符“struct student”,我们可以将这个类型标识符用typedef重新命名为另一个名字ST
22、U:typedef struct student STU;以后就可以按下面的方法来定义结构体变量stu1、stu2了。STU stu1,stu2;此时已有结构体类型标识符“struct student”,我们可以将这个类型标识符用typedef重新命名为另一个名字STU:typedef struct student STU;以后就可以按下面的方法来定义结构体变量stu1、stu2了。STU stu1,stu2;(2)在结构体类型定义时用typedef指定它的结构体类型名。这种方式的一般形式为:typedef struct结构体成员表;结构体类型名;或者:typedef struct 结构体名结
23、构体成员表;结构体类型名;请注意它与下面结构体类型定义的区别:struct 结构体名结构体成员表;变量名列表;即typedef开头定义的结构体类型中,其花括号“”后面是结构体类型名而不是结构体变量名,这一点要尤其注意。例如:typedef struct char name20;int age;char sex;float score;STU;STU stu1,stu2;由此例可以看出,以typedef开头的结构作类型定义中,STU是结构体类型名,因此可以用STU直接定义结构体变量stu1和stu2了。2.typedef与#define在定义结构体类型时的区别我们也可以用宏定义“#define”
24、(在第9章介绍)使用一个符号常量来表示一个结构体类型。例如:#define STU struct studentSTUchar name20;int age;char sex;float score;STU stu1,stu2;从形式上看,#define与typedef很相似,但是两者是有区别的。#define只能作简单的字符串替换,即将字符串“struct student”换成字符串“STU”,而不管struct student的含义如何,即“struct student”可以是一个常量名、变量名、类型标识符等都可以。而typedef的功能则是给已经存在的类型标识符起一个新的名字。此外,宏定
25、义是由预处理完成的;而typedef则是在编译时完成的,它更为灵活方便。例7.4 下面结构体类型及结构体变量定义中正确的是 。解 选项B的错误一是在“struct REC”中应去掉分号“;”,其二是在“REC t1,t2;”前加上struct即可。选项C的错误之一是在结构体类型定义中不能给成员赋初值,给成员赋初值只是针对结构体变量的;错误之二是在“struct”之前有“typedef”,因此“”后出现的只能是一个结构体类型名,而题中“”后的“t1,t2”其本意应是变量名,所以是错误的。选项D的错误是REC是一个结构体变量而不是结构体类型名,D正确的写法应为:structint n;char c
展开阅读全文