C语言程序设计PPT课件第12章结构体和共用体.ppt





《C语言程序设计PPT课件第12章结构体和共用体.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计PPT课件第12章结构体和共用体.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第12121212章章章章 结构体和结构体和结构体和结构体和共用体共用体共用体共用体2023/1/162/60本章学习内容本章学习内容 结构体数据类型,共用体数据类型,枚举数据类型,结构体数据类型,共用体数据类型,枚举数据类型,结构体数据类型,共用体数据类型,枚举数据类型,结构体数据类型,共用体数据类型,枚举数据类型,定义数据类型的别名定义数据类型的别名定义数据类型的别名定义数据类型的别名 结构体变量、结构体数组、结构体指针的定义和初结构体变量、结构体数组、结构体指针的定义和初结构体变量、结构体数组、结构体指针的定义和初结构体变量、结构体数组、结构体指针的定义和初始化始化始化始化 结构体
2、成员的引用,成员选择运算符,指向运算符结构体成员的引用,成员选择运算符,指向运算符结构体成员的引用,成员选择运算符,指向运算符结构体成员的引用,成员选择运算符,指向运算符 向函数传递结构体变量、结构体数组、结构体指针向函数传递结构体变量、结构体数组、结构体指针向函数传递结构体变量、结构体数组、结构体指针向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表动态数据结构、动态链表动态数据结构、动态链表动态数据结构、动态链表2023/1/163/60 二进制数二进制数类型本不存在类型本不存在内存里存的内容,你认为它是什么,它就内存里存的内容,你认为它是什么,它就内存里存的内容,你认为
3、它是什么,它就内存里存的内容,你认为它是什么,它就是什么是什么是什么是什么在早期的机器指令及汇编语言中,数据对在早期的机器指令及汇编语言中,数据对在早期的机器指令及汇编语言中,数据对在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念象均用二进制数表示,没有类型的概念象均用二进制数表示,没有类型的概念象均用二进制数表示,没有类型的概念 一般的一般的CPU只支持两种类型只支持两种类型整数、浮点数整数、浮点数整数、浮点数整数、浮点数12.112.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型2023/1/164/
4、60 在高级语言引入了基本数据类型在高级语言引入了基本数据类型整型、浮点型、字符型等整型、浮点型、字符型等整型、浮点型、字符型等整型、浮点型、字符型等不同语言会定义不同的基本类型不同语言会定义不同的基本类型不同语言会定义不同的基本类型不同语言会定义不同的基本类型基本数据类型并不能方便地解决所有问题基本数据类型并不能方便地解决所有问题基本数据类型并不能方便地解决所有问题基本数据类型并不能方便地解决所有问题 有些语言(如有些语言(如有些语言(如有些语言(如PL/1PL/1)中试图规定较多的类型,如)中试图规定较多的类型,如)中试图规定较多的类型,如)中试图规定较多的类型,如数组、树、栈等,但实践证
5、明不是个好办法数组、树、栈等,但实践证明不是个好办法数组、树、栈等,但实践证明不是个好办法数组、树、栈等,但实践证明不是个好办法12.112.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型2023/1/165/60 用户自己构造数据类型用户自己构造数据类型用户自己构造数据类型用户自己构造数据类型-复合数据类型复合数据类型复合数据类型复合数据类型由基本数据类型迭代派生而来,表示复杂的数据对象由基本数据类型迭代派生而来,表示复杂的数据对象由基本数据类型迭代派生而来,表示复杂的数据对象由基本数据类型迭代派生而来,表示复杂的数据对象
6、典型的代表就是典型的代表就是典型的代表就是典型的代表就是“结构体结构体结构体结构体”抽象数据类型(抽象数据类型(抽象数据类型(抽象数据类型(Abstract Data TypeAbstract Data Type,简称,简称,简称,简称ADTADT)在复合数据类型基础上增加了对数据的操作在复合数据类型基础上增加了对数据的操作在复合数据类型基础上增加了对数据的操作在复合数据类型基础上增加了对数据的操作 抽象数据类型进而进化为抽象数据类型进而进化为抽象数据类型进而进化为抽象数据类型进而进化为“类类类类(Class)”(Class)”这是一个跨时代的进步这是一个跨时代的进步这是一个跨时代的进步这是一
7、个跨时代的进步ClassClass是是是是Object-OrientedObject-Oriented的一个重要概念的一个重要概念的一个重要概念的一个重要概念12.112.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型2023/1/166/60为什么要定义结构体类型为什么要定义结构体类型 在程序里表示一个人(姓名、年龄、性别在程序里表示一个人(姓名、年龄、性别在程序里表示一个人(姓名、年龄、性别在程序里表示一个人(姓名、年龄、性别),),),),怎么表示?怎么表示?怎么表示?怎么表示?想表示多个人呢?想表示多个人呢?想表示多个
8、人呢?想表示多个人呢?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?2023/1/167/60数组的解决方法数组的解决方法2023/1/168/60数组的解决方法数组的解决方法2023/1/169/60 数据的内存管理方式数据的内存管理方式 数组的解决方法数组的解决方法分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高 对数组赋初值时,易发生错位对数组赋初值时,易发生错位 结构显得零散,不易管理结构显得零散,不易管理2023/1/1610/60希望的内存分配图希望的内存分配图 2023/1/
9、1611/60结构体结构体类型类型的声明的声明声明了一个结构体类型声明了一个结构体类型构成结构体的变量构成结构体的变量称为结构体的成员称为结构体的成员(Structure Member)结构体的名字结构体的名字称为结构体标称为结构体标签签(Structure Tag)2023/1/1612/60结构体结构体类型类型的声明的声明结构体模板结构体模板(Structure Template)Dont forget the semicolon!形成一个类型声明的样板形成一个类型声明的样板形成一个类型声明的样板形成一个类型声明的样板用于生成结构体变量用于生成结构体变量用于生成结构体变量用于生成结构体变量
10、但并未声明结构体变量但并未声明结构体变量但并未声明结构体变量但并未声明结构体变量因而编译器不为其分配内存因而编译器不为其分配内存因而编译器不为其分配内存因而编译器不为其分配内存 2023/1/1613/60(1 1)先定义结构体类型,再定义变量名)先定义结构体类型,再定义变量名(2 2)在定义类型的同时定义变量)在定义类型的同时定义变量(3 3)直接定义结构体变量(不指定结构体标签)直接定义结构体变量(不指定结构体标签)结构体结构体结构体结构体变量变量变量变量的定义的定义的定义的定义2023/1/1614/60用用typedef定义数据类型定义数据类型structstruct students
11、tudent stu1,stu2;stu1,stu2;/*It works*/*It works*/studentstudent stu1,stu2;stu1,stu2;/*Can this work?*/*Can this work?*/structstruct stu1,stu2;stu1,stu2;/*Can this work?*/*Can this work?*/STUDENTSTUDENT stu1,stu2;stu1,stu2;/*It works!*/*It works!*/关键字关键字typedef为一种为一种已存在的已存在的类型定义一个类型定义一个别名别名,并未定义新类型,
12、并未定义新类型STUDENT与与struct student类型是类型是同义词同义词2023/1/1615/60等价于等价于结构体变量的初始化结构体变量的初始化结构体变量的初始化结构体变量的初始化等价于等价于注意!注意!2023/1/1616/60 嵌套的结构体(嵌套的结构体(嵌套的结构体(嵌套的结构体(Nested StructureNested Structure)就是在一个)就是在一个)就是在一个)就是在一个结构体内包含了另一个结构体作为其成员结构体内包含了另一个结构体作为其成员结构体内包含了另一个结构体作为其成员结构体内包含了另一个结构体作为其成员 嵌套的结构体嵌套的结构体结构体定义结
13、构体定义可以嵌套可以嵌套2023/1/1617/60 访问结构体变量的成员必须使用访问结构体变量的成员必须使用访问结构体变量的成员必须使用访问结构体变量的成员必须使用成员选择运算符成员选择运算符成员选择运算符成员选择运算符(也称圆点运算符)(也称圆点运算符)(也称圆点运算符)(也称圆点运算符)结构体变量的引用结构体变量的引用 当出现结构体嵌套时,必须当出现结构体嵌套时,必须当出现结构体嵌套时,必须当出现结构体嵌套时,必须以级联方式访问结构体成员以级联方式访问结构体成员以级联方式访问结构体成员以级联方式访问结构体成员2023/1/1618/60【例例例例12.112.1】演示结构体变量的赋值和引
14、用方法演示结构体变量的赋值和引用方法演示结构体变量的赋值和引用方法演示结构体变量的赋值和引用方法结构体变量的引用结构体变量的引用按结构体的成员顺序逐按结构体的成员顺序逐一对相应成员进行赋值一对相应成员进行赋值格式符格式符%02d中中2d前面的前导符前面的前导符0表示输表示输出数据时,若左边有多余位,则补出数据时,若左边有多余位,则补02023/1/1619/60 【例例例例12.112.1】若要从键若要从键若要从键若要从键盘输入结盘输入结盘输入结盘输入结构体变量构体变量构体变量构体变量stu1stu1的内的内的内的内容,那么容,那么容,那么容,那么程序如何程序如何程序如何程序如何修改?修改?修
15、改?修改?两个地址有何不同?两个地址有何不同?2023/1/1620/60 【例例例例12.112.1】若要从键若要从键若要从键若要从键盘输入结盘输入结盘输入结盘输入结构体变量构体变量构体变量构体变量stu1stu1的内的内的内的内容,那么容,那么容,那么容,那么程序如何程序如何程序如何程序如何修改?修改?修改?修改?结构体成员的地址与结构体成员的地址与该成员在结构体中所该成员在结构体中所处的位置及其所占内处的位置及其所占内存的字节数相关存的字节数相关结构体变量的地址结构体变量的地址&stu2是该变量所占是该变量所占内存空间的首地址内存空间的首地址2023/1/1621/60结构体所占内存的字
16、节数结构体所占内存的字节数 struct struct 类型用内存字节数类型用内存字节数类型用内存字节数类型用内存字节数 =?=?是所有成员变量的内存总和吗?是所有成员变量的内存总和吗?是所有成员变量的内存总和吗?是所有成员变量的内存总和吗?printf(%dn,sizeof(printf(%dn,sizeof(structstruct samplesample););用运算符用运算符用运算符用运算符sizeofsizeof获得结构体大小获得结构体大小获得结构体大小获得结构体大小sizeofsizeof(变量或表达式变量或表达式变量或表达式变量或表达式)sizeofsizeof(类型类型类型类
17、型)12printf(%dn,sizeof(printf(%dn,sizeof(SAMPLESAMPLE););【例例例例12.212.2】2023/1/1622/60结构体所占内存的字节数结构体所占内存的字节数事实上,所有数据类型在内存中都是从事实上,所有数据类型在内存中都是从偶数偶数偶数偶数地址开始存放的地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的且结构所占的实际空间一般是按照机器字长对齐的不同的编译器、平台,对齐方式会有变化不同的编译器、平台,对齐方式会有变化结构体变量的成员的存储结构体变量的成员的存储对齐规则对齐规则对齐规则对齐规则是与机器相关的是与机器相关的具有特定数据
18、类型的具有特定数据类型的数据项大小数据项大小数据项大小数据项大小也是与机器相关的也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的12个字节个字节chchf fchchchchchchf f2023/1/1623/6012.3结构体结构体数组数组的定义和初始化的定义和初始化2023/1/1624/6012.3结构体结构体数组数组的定义和初始化的定义和初始化建立了数据库中的多条记录,每条对应一个学生信息建立了数据库中的多条记录,每条对应一个学生信息2023/1/1625/60 【例例例例12.312.3】利用利用利用利用结构体数组计结
19、构体数组计结构体数组计结构体数组计算每个学生的算每个学生的算每个学生的算每个学生的平均分平均分平均分平均分2023/1/1626/6012.4结构体结构体指针指针的定义和初始化的定义和初始化ptstu1 STUDENTSTUDENT stu1;stu1;STUDENTSTUDENT *pt;pt;pt=pt=&stu1;stu1;成员成员1成员成员2成员成员3成员成员4成成员员5 如何定义指向如何定义指向如何定义指向如何定义指向结构体变量结构体变量结构体变量结构体变量的指针?的指针?的指针?的指针?STUDENTSTUDENT *pt=pt=&stu1;stu1;等价于等价于2023/1/16
20、27/6012.4结构体结构体指针指针的定义和初始化的定义和初始化 如何访问如何访问如何访问如何访问结构体指针变量结构体指针变量结构体指针变量结构体指针变量所指向的所指向的所指向的所指向的结构体成员呢?结构体成员呢?结构体成员呢?结构体成员呢?STUDENTSTUDENT stu1;stu1;STUDENTSTUDENT *pt=pt=&stu1;stu1;ptstu1成员成员1成员成员2成员成员3成员成员4成成员员5 通过通过通过通过s stu1tu1和和和和成员选择运算符成员选择运算符成员选择运算符成员选择运算符访问结构体成员访问结构体成员访问结构体成员访问结构体成员stu1.stu1.s
21、tudentID=1;studentID=1;通过通过通过通过ptpt和和和和指向运算符指向运算符指向运算符指向运算符访问结构体成员访问结构体成员访问结构体成员访问结构体成员(*pt).(*pt).studentID=1;studentID=1;pt-pt-studentID=1;studentID=1;2023/1/1628/6012.4结构体结构体指针指针的定义和初始化的定义和初始化ptstu1成员成员1成员成员2成员成员3成员成员4成成员员5 当结构体当结构体当结构体当结构体嵌套嵌套嵌套嵌套时,如何访问结构体时,如何访问结构体时,如何访问结构体时,如何访问结构体指针变量所指向的结构体成员
22、?指针变量所指向的结构体成员?指针变量所指向的结构体成员?指针变量所指向的结构体成员?stu1.stu1.birthday.birthday.year=1999;year=1999;(*pt).(*pt).birthday.birthday.year=1999;year=1999;pt-pt-birthday.birthday.year=1999;year=1999;STUDENTSTUDENT stu1;stu1;STUDENTSTUDENT *pt=pt=&stu1;stu1;2023/1/1629/6012.4结构体结构体指针指针的定义和初始化的定义和初始化 STUDENTSTUDENT
23、 stu30;stu30;STUDENTSTUDENT *pt;pt;pt=stu;pt=stu;如何定义指向如何定义指向如何定义指向如何定义指向结构体数组结构体数组结构体数组结构体数组的指针?的指针?的指针?的指针?STUDENTSTUDENT *pt=stu;pt=stu;等价于等价于STUDENTSTUDENT *pt=&stu0;pt=&stu0;等价于等价于ptstu30stu0stu1stu2stu3stu4stu5.stu292023/1/1630/60使用使用使用使用pt+pt+,使,使,使,使ptpt指向指向指向指向stu1stu1pt-pt-studentIDstudent
24、ID等价于等价于等价于等价于 stu1.stu1.studentIDstudentIDpt12.412.4结构体结构体结构体结构体指针指针指针指针的定义和初始化的定义和初始化的定义和初始化的定义和初始化 STUDENTSTUDENT stu30;stu30;STUDENTSTUDENT *pt=stu;pt=stu;如何访问如何访问如何访问如何访问结构体数组指针结构体数组指针结构体数组指针结构体数组指针指向的指向的指向的指向的结构体成员?结构体成员?结构体成员?结构体成员?stu30stu0stu1stu2stu3stu4stu5.stu292023/1/1631/6012.5向函数传递结构体
25、向函数传递结构体 向函数传递结构体的向函数传递结构体的单个成员单个成员复制单个成员的内容复制单个成员的内容复制单个成员的内容复制单个成员的内容函数内对结构内容的修改不影响原结构函数内对结构内容的修改不影响原结构函数内对结构内容的修改不影响原结构函数内对结构内容的修改不影响原结构 向函数传递结构体的向函数传递结构体的完整结构完整结构 向函数传递结构体的向函数传递结构体的首地址首地址2023/1/1632/60struct date int year;int month;int day;void func(struct date p)p.year=2000;p.month=5;p.day=22;B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 PPT 课件 12 结构 共用

限制150内