结构体与共用体教案.ppt

上传人:za****8 文档编号:14462975 上传时间:2020-07-21 格式:PPT 页数:44 大小:1.06MB
收藏 版权申诉 举报 下载
结构体与共用体教案.ppt_第1页
第1页 / 共44页
结构体与共用体教案.ppt_第2页
第2页 / 共44页
结构体与共用体教案.ppt_第3页
第3页 / 共44页
资源描述:

《结构体与共用体教案.ppt》由会员分享,可在线阅读,更多相关《结构体与共用体教案.ppt(44页珍藏版)》请在装配图网上搜索。

1、2020/7/21,1,第8章 结构体与共用体,2,2020/7/21,从基本数据类型、复合数据类型到抽象数据类型,计算机本身是没有数据类型的概念的 内存里存储的内容,你认为它代表什么它就代表什么 高级语言设计了基本数据类型:整型、浮点型、字符型等。不同的语言也会定义不同的基本类型 基本数据类型并不能方便地解决所有问题 复合数据类型是基本数据类型迭代派生而来 典型的代表就是结构体,数组、指针也可算作此类 抽象数据类型(ADT)在复合数据类型的基础上增加了对数据的操作 抽象数据类型进而进化为“类” 这是一个跨时代的进步,3,2020/7/21,一个问题,在程序里表示一个人(姓名、年龄、性别、身高

2、、体重),怎么表示? char name12;unsigned int age;char sex; 想表示多个人呢? 定义多个数组?(有些搞笑了),4,2020/7/21,C语言的解决办法,struct personchar name12;unsigned int age;char sex; struct person是一个类型 struct person students4; students0.namestudents0.agestudents0.sex 它们都是变量,一般称为结构体的成员变量,5,2020/7/21,结构体(Structure)的内存占用,一个结构变量的成员变量在内存中是

3、相邻的 整个结构体变量的将占用多少内存呢? 是所有成员变量的内存总和吗? 我们可以用sizeof来获得结构的大小,6,2020/7/21,sizeof到底是什么?,它是一个C语言的关键字,并不是函数 可以用两种形式使用 sizeof(表达式) 一般都使用sizeof(变量名) sizeof(类型) 求出的结果为表达式值所属类型或者类型占用的字节数,7,2020/7/21,struct类型的特点,一个普通的类型 所以可以定义该类型的变量、数组、指针 它的成员可以是任意类型 基本类型、数组、指针、结构 可以做函数的参数类型和返回值类型 struct类型的变量 可以互相赋值 所以做为函数的参数时,是

4、传值调用 可以 ;,其中:标识符是定义的结构体类型名;,结构体名,成员、域,11,2020/7/21,举例,定义学生信息的结构体,struct personnel int num; char name10; char sex; int age; float score; char addr30; ;,变量说明,struct 类型 变量名,;,struct personnel person;,12,2020/7/21,先定义类型后定义变量,struct personnel int num; char name10; char sex; int age; float score; char add

5、r30; ;,struct personnel stu1, stu2;,13,2020/7/21,在定义类型同时定义变量,struct personnel int num; char name10; char sex; int age; float score; char addr30; student1, student2;,struct personnel int num; char name10; char sex; int age; float score; char addr30; ; struct personnel student1, student2;,等价,14,2020/7

6、/21,直接定义结构类型变量,struct int num; char name10; char sex; int age; float score; char addr30; student1, student2;,15,2020/7/21,如:struct date int month, day, year; ; struct student int num; char name10; struct date birthday; stu1;,成员也可以是一个结构体变量,16,2020/7/21,结构体变量的初始化,struct personnel long num; char name10

7、; char sex; int age; char addr30; stu=89031, li san , m, 18, 123 beijing road ;,17,2020/7/21,定义指向结构体变量的指针变量,格式,struct 结构类型名 *指针名;,举例,struct student *p, stu1;,p=,指针p即指向结构体变量stu1的地址。,18,2020/7/21,结构体变量的引用圆点运算符,格式,结构体变量名.域名,举例,输出学生档案数据,printf(%d,person.num); printf(%s,person.name); printf(%c,person.sex

8、); printf(%d,person.age); printf(%f,person.score); printf(%s,person.addr);,19,2020/7/21,结构体变量的引用箭头运算符,域表示,结构指针名域名,举例,p num,等价于,(*p).num,struct personnel *p, stu1; p=,20,2020/7/21,结构体变量引用说明,不能将一个结构体变量作为一个整体 进行输入和输出。下面是错误的: printf(%d,%s,%c,%d,%f,%sn, student1); 而应按成员输入和输出。 printf(“%dn”,student1.num);

9、printf(“%sn”student.name0);,如果成员本身又属一个结构体类型, 则要用若干个成员运算符,一级一级地 找到最低一级的成员。只能对最低一级 的成员进行赋值、存取和运算。 struct date struct student int month; int num; int day; char name10 int year; struct date birthday; ; : student1,student2; 例如:student.num student.birthday.month,对结构体变量的成员可以像普通变量 一样进行各种运算。 可以引用结构体变量成员的地址,也

10、 可以引用结构体变量的地址。 例如: scanf(%d, ,21,2020/7/21,思考题,struct pointint x;int y;struct rectstruct point pt1;struct point pt2;,struct rect rt, *rp= 下面表达式哪些合法? rt.pt1.x (*rp).pt1.x rp-pt1.x rt-pt1.x 上面合法的表达式都是等价的吗?,22,2020/7/21,再思考,下面的结构体什么意思? struct somethingstruct something obj1;struct something obj2; 下面的的呢?

11、 struct somethingchar name10;struct something* pOtherObj;,23,2020/7/21,结构体数组定义结构体类型,struct personnel int num; char name10; char sex; int age; float score; char addr30; ;,24,2020/7/21,定义结构体数组,格式,struct personnel int num; char name10; char sex; int age; float score; char addr30; ; struct personnel stu

12、3;,25,2020/7/21,初始化结构体数组,struct personnel stu30 = 10101,Li lin,m,18,87.5,103 Beijing road 10102,Zhang li,f,19,99,130 Shanghai road 10103,Wang bin,m,20,78.5,26 zhongshan road ;,26,2020/7/21,结构体数组和指针,struct personnel stu30, *p; p=stu; *p stu0 *(p+1) stu1 *(p+2) stu2 *(p+3) stu3 stu1.num (*(p+1).num (p

13、+1)-num,27,2020/7/21,结构体类型应用举例:,1、已知:struct sk int a; float b; data, *p;,若有 p = 则正确的引用data 中成员a 的方是:,(*p).data.a B. (*p).a C. P-data.a D. P.data.a,2、读程序,写出运行结果。,4,3,B,28,2020/7/21,结构体与函数,把结构体传递给函数的方式有三种:,用结构体的单个成员作参数,在一般情况下,用单个成员作为实参给函数传递参数与普通的值传递没有分别,可看成普通的实参,是单向值传递,在函数内部对参数进行操作不影响结构体的变化。,29,2020/7

14、/21,用结构体整体作为实参,要求,实参和形参的数据类型相同。,举例,void as(struct personnel stu); main( ) struct personnel stu1; as(stu1); void as(struct personnel stu) ,30,2020/7/21,用指向结构体的指针作为实参,要求,实参和形参指向相同的数据类型。,举例,void as(struct personnel *q); main( ) struct personnel *p,stu1; p= void as(struct personnel *q) ,31,2020/7/21,可以用

15、结构体类型作为函数返回类型,结构体类型作为一种数据类型可以作为参数传递给函数,也可以作为函数的类型 。,举例,struct personnel find(struct personnel *str) return (*str); ,32,2020/7/21,typedef的使用,给已定义的数据类型定义别名。,功能,举例,typedef int integer; typedef struct student stu;,说明,struct student stu1, stu2; 等价于 stu stu1,stu2;,使用别名时,可不使用struct。,33,2020/7/21,共用体(联合体)(U

16、nion),union u_tagint ival;float fval;char* sval; u ; 基本上和struct一样 u.ival、u.fval、u.sval处于同样的地址 sizeof(union xxx)取决于占空间最多的那个成员变量,34,2020/7/21,共用体类型数据的特点,同一个内存段可以用来存放几种类型不同的成员,但在每一瞬间只能存放其中的一种,而不是同时存放几种。即每一瞬间只有一个成员起作用,其他的成员不起作用。,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后,原有的成员就失去作用。 例如: a.i=2; a.ch=d; a.f=3.8; 只

17、有a.f=3.8; 有效,而其他无意义。,共用体变量的地址和它的各成员的地址都是同一地址,即各成员的首地址相同,各成员地址左对齐。,不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,在定义变量时只能对第一个类型初始化。 union a=1; int i; m=a; char ch; float f; a=1, q, 2.8; ,不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。,共用体变量可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。,共用体变量不能进行比较操作。,35,2

18、020/7/21,共用体程序举例,设置若干个人员的数据,其中 有学生和教师。,学生的数据中包含:姓名、号码、性 别、职业、班级。 教师的数据中包含:姓名、号码、性 别、职业、职务。,36,2020/7/21,程序的数据结构,struct int num; char name10; char sex, job; union int class; char position10; category; person2;,37,2020/7/21,main( ) int n, i; for(i=0; i2; i+) scanf(%d%s%c%c,38,2020/7/21,for(i=0; i2; i+

19、) printf( %-6d %-10s %-3c %-3c , personi.num, personi.name, personi.sex, personi.job); if (personi.job=s) printf( %-6d , personi.category.class); else printf( %-6d , personi.category.position); ,39,2020/7/21,C语言的核心学习到此结束,教材P5列出的32个关键字和围绕它们的语法、符号构成了C语言的核心 26个字母以及围绕它们的构词法、语法构成了英语的核心 本课程对C语言核心的讲述并非面面俱到

20、,而是紧抓核心的核心,在理解了核心的核心基础上讲解各种常用和有代表性的外延。一些比较少见,或者很容易理解的,要么一带而过,要么干脆没有涉及 仅掌握语言的核心当然不能熟练运用语言 背下英语的所有单词和语法,你就能写出莎士比亚一样的诗句了吗?,40,2020/7/21,C语言中的三大定律,表达式定律 任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数值类型能够匹配 常见的可以产生数值结果的运算和操作 算术、逻辑、位运算等 ? :、&、*等 有返回值的函数 赋值 常见的需要数值的地方有: 赋值 条件判断 函数调用,41,2020/7/21,C语言中的三大定律,类

21、型定律 任何类型都可以在任何需要类型的地方使用;用任何类型定义的变量都要占用内存 已知特例 函数返回值不能定义为数组类型 函数参数定义为数组类型,此时该参数不占用内存,而是共享函数调用者传入的数组空间 常用类型 基本数据类型、指针、数组、结构 常见的需要类型的地方 定义变量 定义指针、数组和结构 函数参数和返回值 sizeof,42,2020/7/21,C语言中的三大定律,参数传递定律 函数调用时的参数传递永远都是传值调用,把实参的值拷贝给形参 实参:调用者提供的参数 形参:函数定义的参数 基本数据类型无容置疑 struct也无容置疑 指针作为参数时,把指针变量的内容(就是其指向的内存地址)做了拷贝 数组名作为参数时,把它等同于指针看待了,43,2020/7/21,上机题目,1.编写程序,输入10个学生的学号、姓名和3门课程的成绩,将总分最高的学生的信息输出。 2.编写程序,输入下列学生成绩表中的数据,并用结构体数组存放。按外语成绩升序排序并输出。,44,2020/7/21,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!