智能网联汽车计算机基础 课件 项目三任务3:结构体与共用体_第1页
智能网联汽车计算机基础 课件 项目三任务3:结构体与共用体_第2页
智能网联汽车计算机基础 课件 项目三任务3:结构体与共用体_第3页
智能网联汽车计算机基础 课件 项目三任务3:结构体与共用体_第4页
智能网联汽车计算机基础 课件 项目三任务3:结构体与共用体_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

结构体与共用体汽车计算机基础一、课程导入在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据一结构体(structure)。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结一、课程导入为什么使用结构体类型?如果定义一个生信息登记表类型的结构体,应包含哪些成员?结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.1结构体定义结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。例如一个学生的学号、姓名、性别、年龄、成绩、地址,是互相联系的数据,在C语言中用“结构体”来定义。声明一个结构体类型的一般形式:结构体关键字结构体名结构体成员不能省略结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.1结构体定义说明:结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同。结构体也是一种数据类型,它由程序员自己定义,可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。定义一个结构体变量只是描述结构体的组织形式,并不意味着将分配一段内存单元来存放个数据项成员。只有当使用这个类型定义了变量时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.2结构体变量的定义(1)先声明结构体数据类型,再定义结构体数据类型变量。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.2结构体变量的定义(2)在声明结构体数据类型的同时,定义结构体数据类型变量。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.2结构体变量的定义(3)直接定义结构体类型变量(匿名)。这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.2结构体变量的定义定义了结构体变量之后,系统会为结构体变量分配内存,结构体变量所占用的内存空间是各个成员所占的存储空间的总和。注意:结构体数据类型和结构体数据类型变量是两个不同的概念,在编译时,系统只会为变量分配存储空间,而不会为类型分配存储空间。结构体类型中的成员可以单独使用,它们的作用和地位和同类型的普通变量一样。在结构体数据类型中,结构体数据类型的成员的数据类型也可以是结构体数据类型。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.3结构体变量的引用在定义结构体类型变量以后,就可以引用结构体类型变量,如赋值,存取和运算等。结构体成员的引用方式:例如:"."是成员运算符,它在所有的运算符中优先级最高。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.3结构体变量的引用结构体变量的引用遵循以下规则:(1)结构体变量不能整体输入输出。(2)只能对结构体变量中的各个成员分别进行输入输出。(3)如果成员本身还是结构体类型,则要继续使用“.”,逐级找到最低一级成员,对其进行赋值存取等操作。(4)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可进行的运算)。(5)可以引用结构体变量成员的地址,也可以引用结构体变量的地址,但是不能使用类似如下语句整体读入结构体变量。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结二、结构体类型与结构体变量2.4结构体变量的初始化和其他类型的变量一样,对结构体变量可以在定义时指定初始值。例如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结三、结构体数组3.1

结构体数组的定义结构体数组是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。在C语言中,定义结构体数组和定义结构体变量的方式类似,在定义结构体的时候一起定义结构体数组,一般形式为:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结三、结构体数组3.1

结构体数组的定义结构体数组是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。在C语言中,定义结构体数组和定义结构体变量的方式类似,在定义结构体的时候一起定义结构体数组,一般形式为:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结三、结构体数组3.2结构体数组的初始化结构体数组在定义的同时也可以初始化,一般形式为:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结三、结构体数组3.2结构体数组的初始化结构体数组的使用也很简单。例如,获取Wangming的成绩:修改Liping的学习小组:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结当一个指针变量指向结构体时,我们就称它为结构体指针。一个结构体变量的指针就是该结构体变量所占据内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。同时指针变量也可以用来指向结构体数组中的元素。结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。四、结构体指针指向结构体变量的指针指向结构体数组的指针结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结四、结构体指针4.1指向结构体变量的指针(1)指向结构体变量的指针的定义:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结四、结构体指针4.1指向结构体变量的指针(2)利用指针引用结构体变量成员的方式:也可以写成:在C语言中,为了方便使用和使之直观,可以把(*p).num改用p->num来代替。它表示指针变量p所指向的结构体变量中的num成员。同样(*p).score等价于p->score。但是要注意的是,只有“指针变量名”后面才能加“->”,千万不要在成员名后面加“->”。*取內容符,*指针变量表示指针指向的变量。“->”是“指向结构体成员运算符”结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结四、结构体指针4.1指向结构体变量的指针综上所述,如果p指向一个结构体变量stu,以下3种结构体成员的引用方法等价:stu.成员名(如stu.num);(*p).成员名(如(*p).num);p->成员名(如p->num)。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结四、结构体指针4.2指向结构体数组的指针结构体数组的每一个元素都是一个结构体变量。如果定义一个结构体指针变量并把结构体数组的数组名赋给这个指针变量的话,就意味着将结构体数组的第一个元素,即第一个结构体变量的地址,也即第一个结构变量中的第一个成员的地址赋给了这个指针变量。例如:也可以写成:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结四、结构体指针4.2指向结构体数组的指针例如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结四、结构体指针4.2指向结构体数组的指针注意:(1)如果p的初值为stu,即指向第一个元素,则p加1后p就指向下一个元素的起始地址。(2)(++p)->num和(p++)->num的区别:(++p)->num先使p加1,然后得到它指向的元素中num成员值,(p++)->num先得到p->num的值,再使p加1,指向stu[1]。(3)程序已经定义了p是指向structstudent类型数据的指针变量,用来指定一个structstudent型的数据,不应用来指向stu数组元素中的某一成员。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结五、结构体变量的跨函数引用5.1结构体变量作为函数参数使用结构体变量作为函数的实参时,采用的是值传递,会将结构体变量所占内存单元的内容全部顺序传递给形参,形参必须是同类型的结构体变量。函数体:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结五、结构体变量的跨函数引用5.2结构体指针作为函数参数结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址。函数体:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结五、结构体变量的跨函数引用5.2结构体指针作为函数参数例如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结六、共用体6.1共用体的概念使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。定义使用共用体类型变量的一般形式:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结六、共用体6.1共用体的概念结构体和共用体的区别:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结六、共用体6.3共用体类型数据的特点(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。(2)可以对共用体变量初始化,但初始化表中只能有一个常量。(3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。(4)共用体变量的地址和它的各成员的地址都是同一地址。(5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。(6)以前的C规定不能把共用体变量作函数参数,但可以使用指向共用体变量的指针作函数参数。(7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结七、枚举类型7.1枚举类型的定义枚举类型是ANSIC新标准所增加的。如果一个变量只有几种可能的值,可以定义为枚举类型,所谓的枚举是批将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。声明枚举类型用enum开头,枚举类型的定义形式为:enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1,valueName2,valueName3,......是每个值对应的名字的列表。注意最后的;不能少。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结七、枚举类型7.1枚举类型的定义例如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结七、枚举类型7.2枚举类型的说明(1)在C编译中,对枚举元素按常量处理,它们不是变量,不能对其赋值,类似于:sun=0;是错误的。(2)枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,1,2...在上面定义中,sun值为0,mon的值为1,....sat的值为6。如果有赋值语句:workday变量的值为1。这个整数是可以输出的。如:也可以改变枚举元素的值,在定义时由程序员指定,如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结七、枚举类型7.2枚举类型的说明(3)枚举值可以用来做判断比较。如:枚举值的比较规则是按其在定义时的顺序号比较的,如果定义时未指定,则第一个枚举值默认为0。故mon大于sun,sat>fri。(4)一个整数不能直接赋值给一个枚举变量。如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结八、用typedef定义类型别名8.1用typedef定义类型别名定义C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。起别名的目的不是为了提高程序运行效率,而是为了编码方便。使用关键字typedef可以为类型起一个新的别名,语法格式为:oldName是类型原来的名字,newName是类型新的名字。例如:结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结八、用typedef定义类型别名8.2注意事项(1)用typedef可以声明各种类型名,但不能定义变量。用typedef可以声明数组类型,字符串类型,使用比较方便。(2)用typedef只是对已经存在的类型增加一个类型名,而不是创造一个新的类型。(3)typedef和#define区别。①用法不同:typedef用来定义一种数据类型的别名,增强程序的可读性。define主要用来定义常量,以及书写复杂使用频繁的宏。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结八、用typedef定义类型别名8.2注意事项②执行时间不同:typedef是编译过程的一部分,有类型检查的功能。define是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。③typedef定义是语句,因为句尾要加上分号。而define不是语句,千万不能在句尾加分号。(4)当不同的源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放到一个文件中,然后在需要用到它们的文件中用#define命令把它们包含进来。(5)使用typedef有利于程序的通信与移植。有时程序会依赖于硬件特性,用typedef便于移植。结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。在C语言中不允许动态数组类型。例如:a[n]就是错误的,必须要用一个实际的数字表示数组长度,但是在实际开发中,往往会发生这种情况,即所需要的内存空间取决于实际输入的数据,而无法预先确定。对于以上问题,使用数组的办法很难解决,只能通过内存管理函数,动态分配内存空间。常用的内存管理函数有分配内存空间函数malloc、calloc以及释放内存空间函数free。九、动态存储分配malloc函数calloc函数free函数结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结函数原型:其作用是在内存的动态存储中分配一个长度为size的连续空间(size是一个无符号数)此函数的返回值是一个指向分配域起始地址的指针(void)。如果此函数未能成功地执行(例如内存空间不足),则返回Null。九、动态存储分配9.1malloc函数结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结函数原型:调用格式:其作用是在内存分配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。函数返回一个指向分配域起始地址的指针。如果分配不成功,返回Null。用calloc函数可以为一维数组开辟动态存储空间,n为数组个数,每个元素长度为size与malloc函数的区别:malloc函数是动态分配一段存储空间,而calloc函数是动态分配连续的存储空间。九、动态存储分配9.2calloc函数结构体指针课程导入结构体数组结构体类型与结构体变量共用体结构体变量的跨函数引用枚举类型用typedef定义类型别名动态存储分配总结函数原型:其作用是释放由p指向的内存区,使这部分内存区能被

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论