《《c语言程序设计教学资料》第12章-结构体和共同体.ppt》由会员分享,可在线阅读,更多相关《《c语言程序设计教学资料》第12章-结构体和共同体.ppt(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第12章章 结构体和共用体结构体和共用体主要内容主要内容 定定义结义结构体构体类类型型变变量的方法量的方法 结结构体构体变变量的引用量的引用 结结构体构体变变量的初始化量的初始化 结结构体数构体数组组 指向指向结结构体构体类类型数据的指型数据的指针针 共用体共用体 用用typedef定定义类义类型型为什么要定义结构体类型为什么要定义结构体类型n在程序例如何表示一人(姓名、年龄、性别在程序例如何表示一人(姓名、年龄、性别)n想表示多个人呢?想表示多个人呢?n如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?初始化初始化优点:优点:结构紧凑,方便管理,数据的相关性强,便于查
2、找,结构紧凑,方便管理,数据的相关性强,便于查找,赋值时只针对某个学生,局部的输入错误不会影响全局和赋值时只针对某个学生,局部的输入错误不会影响全局和其他人信息其他人信息结构体和共用体结构体和共用体nC C语言允许用户根据具体问题利用已有的基本类型语言允许用户根据具体问题利用已有的基本类型来构造自己所需的数据类型来构造自己所需的数据类型n数组、结构体、共用体都数据构造性数据类型数组、结构体、共用体都数据构造性数据类型n结构体定义:由若干不同类型的数据项组成(结构体定义:由若干不同类型的数据项组成(不同不同类型数据的集合类型数据的集合),构成结构体的各个数据项称为),构成结构体的各个数据项称为结
3、构体成员结构体成员n共同体定义:由若干不同类型的数据项组成,构成共同体定义:由若干不同类型的数据项组成,构成共同体的各个数据项称为共同体成员共同体的各个数据项称为共同体成员 数组、结构体、共同体比较数组、结构体、共同体比较n数组:数组:相同类型数据构成,适合于对具有相同类型相同类型数据构成,适合于对具有相同类型属性的数据进行批处理属性的数据进行批处理n结构体:结构体:将不同类型的数据组织到统一的名字下,将不同类型的数据组织到统一的名字下,适合于关系紧密、逻辑相关、具有相同或者不同属适合于关系紧密、逻辑相关、具有相同或者不同属性的数据进行处理,适合于数据库管理系统性的数据进行处理,适合于数据库管
4、理系统n共同体:共同体:逻辑关系相关的不同类型数据集合,但数逻辑关系相关的不同类型数据集合,但数据成员是情形互斥的,每个时刻只有一个数据成员据成员是情形互斥的,每个时刻只有一个数据成员起作用。起作用。struct 结构体名结构体名 数据类型数据类型 成员成员1 1名字;名字;数据类型数据类型 成员成员2 2名字;名字;数据类型数据类型 成员成员n n名字;名字;;成员列表结构体结构体n 定义结构体定义结构体第一步:声明结构体模板第一步:声明结构体模板n 格式:格式:如:如:struct student int num;char name20;char sex;int age;float sco
5、re4;char addr30;声明结构体模板的主要目的是利用已有的数据类型定义一个新的声明结构体模板的主要目的是利用已有的数据类型定义一个新的数据类型数据类型 结构体模板只是声明了一种数据类型,定义了数据的组织形式,结构体模板只是声明了一种数据类型,定义了数据的组织形式,并未声明结构体类型的变量并未声明结构体类型的变量n 定义结构体定义结构体第二步:利用已经定义好的结构体数据类第二步:利用已经定义好的结构体数据类型定义结构体变量型定义结构体变量n 定义结构体变量方式:定义结构体变量方式:(1 1)先声明结构体模板,在定义结构体变量)先声明结构体模板,在定义结构体变量struct 结结构体名构
6、体名 结结构体成构体成员变员变量的定量的定义义;变变量名量名1,变变量名量名2,.,变变量名量名n;struct 结结构体名构体名 成成员员列表列表;struct 结结构体名构体名 变变量名量名1,变变量名量名2,.,变变量名量名n;(2 2)在声明结构体模板的同时定义结构体变量)在声明结构体模板的同时定义结构体变量(3 3)在直接定义结构体变量)在直接定义结构体变量struct 结结构体成构体成员变员变量的定量的定义义;变变量名量名1,变变量名量名2,.,变变量名量名n;此时不出现结构此时不出现结构体名体名方法二:方法二:struct student int number;char name
7、20;char sex;int age;float score;stu1,stu2;方法一:方法一:struct student int number;char name20;char sex;int age;float score;struct student stu1,stut2;说明:说明:n结构体名(结构体名(struct):用于标识一种新的数据类型,即结:用于标识一种新的数据类型,即结构体类型,可以省略。构体类型,可以省略。n注意区分结构体类型与基本数据类型的不同,它是复注意区分结构体类型与基本数据类型的不同,它是复合数据类型。合数据类型。n结构体成员变量与普通变量的定义一样,它还可
8、以是结构体成员变量与普通变量的定义一样,它还可以是结构体变量。结构体变量。嵌套的结构体嵌套的结构体numnamesexagebirthdayaddrmonthdayyearstruct Date int month;int day;int year;struct Stu int num;char name20;char sex;int age;struct Date birthday;char addr30;用用typedef定义数据类型定义数据类型n 只是为一种已经存在的类型(系统固有或者用户自定只是为一种已经存在的类型(系统固有或者用户自定义的数据类型)定义一个新名字而已,并未定义一个义的
9、数据类型)定义一个新名字而已,并未定义一个新的数据类型新的数据类型 例:typedef int integer;n typedef优点之一:优点之一:有利于程序的通用性和移植性,有利于程序的通用性和移植性,程序会依程序会依赖于硬件特性,用赖于硬件特性,用typedef类型就便于移植。类型就便于移植。例:用例:用typedef来定义与平台无关的类型。来定义与平台无关的类型。定义一个叫定义一个叫INTEGER的的int类型,在目标平台一上,它占类型,在目标平台一上,它占4个个字节:字节:typedef int INTEGER;在某些平台下,在某些平台下,int占占2个字节。要使数据类型的取值范围不
10、变,个字节。要使数据类型的取值范围不变,只需要做如下定义:只需要做如下定义:typedef long INTEGER;也就是说,当跨平台时,只要改下也就是说,当跨平台时,只要改下 typedef 本身就行,不用对本身就行,不用对其他源码做任何修改。其他源码做任何修改。ntypedef与与#define有相似之有相似之处处 例如:例如:typedef int COUNT;#define COUNT int 作用:都是用作用:都是用COUNT代表代表int。nBut,它它们们二者是不同的。二者是不同的。#define是在是在预编译时处预编译时处理的,它只能作理的,它只能作简单简单的字符的字符串替串
11、替换换;typedef是在是在编译时处编译时处理的。理的。实际实际上它并不是作上它并不是作简简单单的字符串替的字符串替换换,而是采用如同定,而是采用如同定义变义变量的方法那量的方法那样样来声明一个来声明一个类类型。型。结构体变量初始化结构体变量初始化100310121王刚M199172839082对字符数组类型结构体成员进行赋值时,必须使用字符串处理函数对字符数组类型结构体成员进行赋值时,必须使用字符串处理函数strcpy()结构体变量的引用结构体变量的引用例例:n 当出现结构体嵌套时,必须以级联方式访问结构体当出现结构体嵌套时,必须以级联方式访问结构体成员成员结构体变量输入输出结构体变量输入
12、输出结构体变量的地址是结构体变量所占内存空间的首地址,而结构体结构体变量的地址是结构体变量所占内存空间的首地址,而结构体成员的地址与结构体成员在结构体中所处的位置及该成员所占内存成员的地址与结构体成员在结构体中所处的位置及该成员所占内存空间的字节数相关空间的字节数相关在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则:(1 1)不能将一个结构体变量作为一个整体进行输入和输出)不能将一个结构体变量作为一个整体进行输入和输出。例:例:printf(“%d,%s,%c,%d,%fn”,stu1);(2 2)如果成员本身又属一个结构体类型)如果成员本身又属一个结构体类型,则要用若干个成员运
13、则要用若干个成员运算符算符,一级一级地找到最低的一级的成员。只能对最低级的成员一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。进行赋值或存取以及运算。例:例:(3 3)对结构体变量的成员可以像普通变量一样进行各种运算)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。(根据其类型决定可以进行的运算)。例:例:stu2.score=stu1.score;sum=stu1.score+stu2.score;student1.age+;+student2.age;(4 4)可以引用结构体变量成员的地址,也可以引用结构体变)可以引用结构体变量成
14、员的地址,也可以引用结构体变量的地址。量的地址。例:例:scanf(%d,&stu1.num);(输入(输入stud1.num的值)的值)printf(%p,&stu1););(输出(输出stud1的首地址)的首地址)结构体所占内存的字节数结构体所占内存的字节数多数计算机为了提高内存的寻址效率,为特定的数据类型引入了多数计算机为了提高内存的寻址效率,为特定的数据类型引入了特殊的内对齐需求。不同的系统和编译器,内存对齐的方式不同特殊的内对齐需求。不同的系统和编译器,内存对齐的方式不同,为了满足处理器对齐的要求,可能会在较小的成员后加入补位,为了满足处理器对齐的要求,可能会在较小的成员后加入补位,
15、导致结构体实际所占内存的字节数比我们想象的多,导致结构体实际所占内存的字节数比我们想象的多结构体数组的定义和初始化结构体数组的定义和初始化结构体指针的定义和初始化结构体指针的定义和初始化以下以下3 3种形式等价种形式等价:结构体变量成员名结构体变量成员名(*)成员名)成员名 -成员名成员名向函数传递结构体向函数传递结构体n 用结构体指针或结构体数组作为函数参数,向函用结构体指针或结构体数组作为函数参数,向函数传递结构体的地址数传递结构体的地址按值调用按值调用按地址调用按地址调用结构体变量作函数参数结构体变量作函数参数实现按值调用实现按值调用结构体指针作函数参数结构体指针作函数参数从函数返回从函数返回结构体变量的值结构体变量的值共用体共用体共用体所占内存的字节数共用体所占内存的字节数不能为共用体的所有成员同时进行初始化,只能对第一个成员进行不能为共用体的所有成员同时进行初始化,只能对第一个成员进行初始化。此外,共用体成员不能进行比较操作,也不能作为函数参初始化。此外,共用体成员不能进行比较操作,也不能作为函数参数。数。