《第8章 指针、结构体与共用体2.pptx》由会员分享,可在线阅读,更多相关《第8章 指针、结构体与共用体2.pptx(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程主讲人:第8章 指针、结构体与共用体2C语言程序设计3C语言程序设计(第二版)4第8章 指针、结构体与共用体1本章通过一个简单的案例引入,介绍了指针的基本概念、指针运算、指针与数组等内容。2同时也重点介绍结构体、共用体、枚举等各种复合数据类型的定义及使用方法,介绍了使用typedef重新定义类型名的方法。5第8章 指针、结构体与共用体知识点:指针的概念和使用。指针的运算。指针和数组的关系。结构体的概念、定义和使用。结构体数组和结构体指针。共用体的概念、定义和使用。枚举的概念、定义和使用。使用typedef重新定义类型名。技能点:能熟练掌握Dev-C+集成环境的操作步骤。6第8章 指针、结构
2、体与共用体8.4 共 用 体共用体也是一种能够将不同类型的数据组合在一起的构造类型,但它与结构体不同。共用体中所有成员占用的是同一段存储区域,在同一时刻,只能有一个成员起作用。1共用体类型及变量的定义共用体类型的定义方法与结构体类型的相似,只需将关键字改为union即可。其一般形式为:7第8章 指针、结构体与共用体union 共用体类型名 数据类型成员名1; 数据类型成员名2; 数据类型成员名n;8第8章 指针、结构体与共用体例如:union data int i; char c; float f;共用体变量的定义方式与结构体变量的定义方式相似,也分为3种方式:9第8章 指针、结构体与共用体(
3、1)将共用体类型的定义与共用体变量的定义分开。例如:union data int i; char c2; float f;union data x,y;10第8章 指针、结构体与共用体(2)在定义共用体类型的同时定义共用体变量。例如:union data int i; char c2; float f;x,y;11第8章 指针、结构体与共用体(3)直接定义共用体类型的变量,不给出共用体类型名。例如:union int i; char c2; float f;x,y;共用体变量在内存中所占的字节数等于长度最长的成员所占的字节数。例如,上述共用体变量x、y中3个成员i、c、f的长度分别为2、2、4
4、,成员f的长度最长,所以这两个共用体变量在内存中都是占用4字节的存储空间。12第8章 指针、结构体与共用体2共用体变量的引用和结构体变量相似,共用体变量中的成员也是通过“.”和“-”两种运算符来引用,具体引用方式有以下三种:(1)共用体变量名.成员名。(2)共用体指针变量名-成员名。(3)(*共用体指针变量名).成员名。例如:union data a,*p;p=&a;则对a中i成员的引用可以是:a.i,p - i或(*p).i。13第8章 指针、结构体与共用体例如:union int i; char c2; float f;b;scanf(%d%s%f,&b);程序在编译时不会报错,但运行结果
5、会出错。将“scanf(%d%s%f,&b);”改为“scanf(%d,&b.i);”就对了。14第8章 指针、结构体与共用体共用体在一般的编程中应用较少,在单片机中应用较多。对于PC,经常使用到的一个实例是:现有一张关于学生信息和教师信息的表格如表8-1所示。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。15第8章 指针、结构体与共用体表8-1 学生和教师信息表NameNumSexProfessionScore / CourseLiuMing201fs78.5WuMing311mtEnglishXuMing409ftMathLiuYang582ms
6、96.0f 和 m 分别表示女性和男性,s 表示学生,t 表示教师。可以看出,学生和教师所包含的数据是不同的。现在要求把这些信息放在同一个表格中,并设计程序,输入人员信息然后输出。16第8章 指针、结构体与共用体如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前4个成员变量是一样的,第5个成员变量可能是score或者course。当第4个成员变量的值是s的时候,第5个成员变量就是score;当第4个成员变量的值是t的时候,第5个成员变量就是course。经过上面的分析,我们可以设计一个包含共用体的结构体。17第8章 指针、结构体与共用体【例8-9】设计一个包含共用体的结构体,完成学
7、生和教师信息表格。程序代码:打开链接18第8章 指针、结构体与共用体8.5 枚 举 类 型有时会遇到这种情况,即一个变量取值的个数是有限的,如人的性别只有男和女两种、一个星期只有7天、一年只有12个月,等等。对于这些类型的数据,C语言可以将其每一个可能的取值依次列举出来,这种方法称为枚举。用这种方法定义的数据类型称为枚举类型。枚举类型的定义形式为:enum 枚举类型名枚举元素取值表;19第8章 指针、结构体与共用体例如:enum weekdayssun,mon,tue,wed,thu,fri,sat;定义好的枚举类型可以用来定义枚举变量,例如:enum weekdays workday;则wo
8、rkday变量的取值范围只能是sunsat,例如:workday = wed;20第8章 指针、结构体与共用体也可以在定义枚举类型的同时直接定义枚举变量,例如:enum weekdayssun,mon,tue,wed,thu,fri,satweek_end;在C语言编译系统中,枚举元素在定义时就根据其在列表中的序号被赋予固定的值,这个值是一个常量,在程序运行过程中是不可以动态改变的,因此对枚举元素是不能作赋值运算的。21第8章 指针、结构体与共用体如果在枚举元素列表中没有特别给出某个元素的序号,则默认从0开始编号。例如:enum weekdayssun,mon,tue,wed,thu,fri,
9、sat;在该枚举元素列表中,sun的值为0,mon的值为1,依此类推。枚举元素的值也可以人为指定,例如:enum weekdayssun = 7,mon = 1,tue,wed,thu,fri,sat;则sun的值为7,mon的值为1,tue的值为2,wed的值为3,依此类推。22第8章 指针、结构体与共用体【例8-10】从键盘输入星期的阿拉伯数字,显示与该整数对应的枚举常量的英文名称。程序代码:打开链接23第8章 指针、结构体与共用体8.6 定义符typedef语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是允许由用户为数据类型取“别名”。类型定义符typedef就可
10、用来完成此功能。例如,有整型量a、b,其声明如下:int a,b;24第8章 指针、结构体与共用体其中,int是整型变量的类型说明符。int的完整写法为integer,为了增加程序的可读性,可把整型说明符用typedef定义为:typedef int INTEGER以后就可用INTEGER来代替int作整型变量的类型说明。25第8章 指针、结构体与共用体例如:INTEGER a,b;等效于:int a,b;用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单,而且使意义更为明确,因而增强了可读性。26第8章 指针、结构体与共用体例如:typedef char NAME
11、20;表示NAME是字符数组类型,数组长度为20。然后可用NAME声明变量,例如:NAME a1,a2,s1,s2;完全等效于:char a120,a220,s120,s22027第8章 指针、结构体与共用体又如:typedef struct stu char name20; int age; char sex; STU;定义STU表示stu的结构类型,然后可用STU来说明结构变量:STU body1,body2;typedef定义的一般形式为:typedef 原类型名 新类型名其中,原类型名中含有定义部分,新类型名一般用大写表示,以便于区别。有时也可用宏定义来代替typedef的功能,但是宏
12、定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。28第8章 指针、结构体与共用体8.7 程序设计举例【例8-11】计算全班学生的总分、平均分和不及格的人数。程序分析:本例程序中定义了一个外部结构数组boy,共5个元素,并做了初始化赋值。在main()函数中用for语句逐个累加各元素的score成员值存于s之中,如score的值小于60(不及格)即计数器count加1,循环完毕后计算平均成绩,并输出全班总分、平均分及不及格人数。程序代码:打开链接29第8章 指针、结构体与共用体【例8-12】建立同学通讯录。程序分析:本程序中定义了一个结构mem,它两个成员name和p
13、hone来表示姓名和电话号码。在主函数中定义man为具有mem类型的结构数组。在for语句中,用gets()函数分别输入各个元素中两个成员的值,然后又在for语句中用printf语句输出各元素中两个成员值。程序代码:打开链接30第8章 指针、结构体与共用体【例8-13】一个使用共同体的实例。程序分析:从上面的运行结果可看出,对共用体变量成员进行赋值,保存的是最后的赋值,前面对其他成员的赋值均被覆盖。由于结构体变量的每个成员拥有不同的存储单元,因而不会出现这种情况。程序代码:打开链接31第8章 指针、结构体与共用体本章主要介绍了指针等,指针是C语言的一个重要概念,也是C语言的一个重要特色。正确灵
14、活地运用指针,可以使程序简洁、紧凑、高效;可以有效地表示复杂的数据结构。可以说,不掌握指针就没有掌握C语言的精华。本章主要介绍了结构体、共用体和枚举类型这些复合的数据类型,通过这些类型的学习,可使读者掌握较复杂的数据结构。此外,还介绍了用typedef类型定义的语句,它可以使程序简化,方便编程。结构体类型将不同类型的数据组合在一起,方便数据的处理。使用结构体类型时,必须先定义类型、再定义结构体变量后才能使用。小 结32第8章 指针、结构体与共用体通过直接成员运算符“.”或间接引用成员运算符“-”来引用结构体变量的各个成员,其成员的使用与同类型普通变量相同。结构体变量可以作为一个整体参加赋值运算,但不能作为一个整体进行输入/输出。共用体也是一种构造类型,它的各个成员占有同一段存储空间。共用体变量所占的空间大小等于其成员中所占存储空间的最大数。使用共用体类型的目的是节省内存。枚举类型是一种用户自定义的数据类型,在枚举类型的定义中列举出所有可能的取值,被声明为该枚举类型的变量,其取值不能超过定义的范围。typedef类型定义只是定义了一个数据类型的别名,而不是定义一种新的数据类型,所以原来的类型名仍可以使用,不能使用typedef定义变量。小 结