C语言学习第十章结构和杂类.ppt
《C语言学习第十章结构和杂类.ppt》由会员分享,可在线阅读,更多相关《C语言学习第十章结构和杂类.ppt(63页珍藏版)》请在三一办公上搜索。
1、第十章结构体和杂类,2,本章教学内容、要求,内容、结构体类型的定义,结构体变量的定义、引用、初始化及结构体数组;2、指向结构体类型数据的指针及用指针处理链表;3、共用体的概述;4、枚举类型的说明;5、用 typedef 定义类型。要求、了解结构体类型变量及结构体数组;2、掌握结构指针;3、掌握用指针处理链表;4、了解共用体的概述和枚举类型的说明;5、简单了解用 typedef 定义类型。,3,重点与难点,重点1.结构体及结构体数组的引用;2.用指针处理链表。难点用指针处理链表,4,10.1结构,在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字
2、符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。如:语言中提供了另一种构造数据类型“结构体”。它相当于其它高级语言中的记录。“结构体”是一种构造类型,它是由若干“成员”组成的。,5,10.1结构,一、定义一个结构体的一般形式为:struct 结构名 成员表列;二、成员类型说明形式为:类型说明符 成员名;因此若有n个成员,其结构体定义形式为:struct 结构名 类型说明符1 成员名1;类型说明符2 成员名2;.类型 说明符n 成员名n;;,例如:struct student int num;char name20;char sex;int age;f
3、loat score;char addr30;注意在括号后的分号是不可少的。,6,定义结构体类型变量的三种方法,一、先定义结构体类型,再定义变量名:定义结构体类型的一般形式:struct 结构体名 成员表列;定义结构体变量的一般形式:struct 结构体名 变量名;二、定义结构类型的同时定义结构变量:.定义的一般形式:struct 结构体名 成员表列 变量名表列;三、直接定义结构类型变量 定义的一般形式:struct 成员表列 变量名表列;,7,定义结构体类型变量的三种方法,一、先定义结构体类型,再定义变量名:如:struct student int num;char name20;char
4、sex;int age;float score;char addr30;struct student s1,s2;/*变量定义*/,8,定义结构体类型变量的三种方法,二、定义结构类型的同时定义结构变量:.如:struct student int num;char name20;char sex;int age;float score;char addr30;s1,s2;,9,定义结构体类型变量的三种方法,三、直接定义结构类型变量:如:struct int num;char name20;char sex;int age;float score;char addr30;s1,s2;,10,定义结
5、构体类型变量的三种方法,四、关于结构体类型的说明:1、类型与变量是不同的概念2、结构体成员可象变量一样单独使用3、成员还可以是结构体变量如:struct date int month;int day;int year;4、成员名可以与变量同名,struct student int num;char name20;char sex;int age;struct date birthday;char addr30;s1,s2;,11,结构体类型变量的引用,只有在对结构体变量赋值或作为参数传递给函数等特殊情况下可以直接对一个结构体变量整体操作。其他情况只能对结构体变量的各个成员分别引用。一、结构体变
6、量成员引用的一般形式:结构体变量名.成员名 如:s1.num 成员变量可以进行各种运算(如普通变量一样),如:+s1.num;二、结构体嵌套引用:.如:s1.birthday.day三、同类型的结构体变量间可相互赋值 如:s1=s2四、可引用结构体变量或成员的地址 如:scanf(%d,/*输出s1的首地址*/结构体变量的地址主要用于函数参数,传递结构体的地址,成员运算符,12,结构体变量的初始化,外部、静态和自动结构体变量可以初始化如:struct student long int num;char name20;char sex;char addr20;s1=99001,Li Lin,M,
7、Bejing;,13,例如,下面的程序说明了访问结构成员的方法:结构成员变量的引用:.如:stu.student_num=990505;strcpy(stu.name,”Li”);/*注意:不能用赋值语句*/stu.sex=M;stu.age=18;stu.score=85.7;因为我们用结构来实现的目的,就是要区分一个数据聚集中的每个分量的类型和意义,每个分量数据类型可以相异,更重要的是,为了区分数据内容的意义。结构的成员有自己单独的名字,也就能区分每个成员各自的意义。,14,结构体变量的初始化,例10-1 输入某班32名学生的学号和考试成绩,求成绩最好的学生的学号和成绩及总成绩。分析:定义
8、结构体,包含两个成员:学号和成绩。,main()struct struct_name int num;float score;student,max;int i;float sum;max.score=0;sum=0;,定义结构体类型struct_name,结构体变量student和max,用来存放成绩最好的那个学生的信息。,i 用来控制循环 sum用来存放总成绩,变量初始化,15,在数组中,数组是不能彼此赋值的。例如,下面数组的赋值语句会导致一个编译错误:void main()char a10,b10;a=b;/error/.这主要是因为数组名是一个常量指针,不允许被赋值。数组是一个数据类型
9、的聚集,它本质上不是数据类型,定义的每个数组都认为是不同类型的,即使数组元素个数相同,如a与b。因而无法看作是同类型数据之间的赋值。结构就不同了,它大小固定,可以被赋值。,16,例【10-1】:本程序 的输出结果是什么?#include struct Personchar name20;unsigned long id;float salary;Person pr1=Frank Voltaire,12345678,3.35;void main()Person pr2;pr2=pr1;/结构变量的赋值printf(%s%ld%f,pr2.name,pr2.id,pr2.salary);,程序中定
10、义了一个全局Person结构变量prl,它使用与初始化数组相似的方法进行初始化。在main()函数中,定义了一个结构变量pr2,然后使用赋值运算符将prl的内容赋值给pr2。在结构Person中,成员name是一个字符数组,通过结构变量的赋值,该数组作为成员也被赋值了。,17,10.1.3结构体数组,一、结构体数组的定义如:struct student long int num;char name20;char sex;int age;float score;char addr30;struct student stu3;以上定义了一个数组 stu,数组有3个元素,元素类型为struct st
11、udent。,18,结构体数组,二、结构体数组的初始化如:struct student long int num;char name20;char sex;int age;float score;char addr30;stu3=101,Li ping,M,45,80,Beijing,102,Zhang ping,M,30,62.5,Shanghai,103,He fang,F,22,92.5,Tianjin;,19,例【10-2】下面的程序中,对一个Person结构数组进行“冒泡法”排序,分数高的排在后面:#include struct Person char name20;unsigned
12、 long id;float score;Person allone6=jone,12345,339.0,david,13916,449.0,marit,27519,311.0,jasen,42876,623.0,peter,23987,400.0,yoke,12335,511.0;void main()Person temp;for(int i=1;i allonej+1.score)/比较分数 temp=allonej;/结构变量的交换 allonej=allonej+1;allonej+1=temp;for(int k=0;k6;k+)/输出printf(%s,allonek.name)
13、;printf(%ld,allonek.id);printf(%f,allonek.score);,20,10.1.4 结构与函数,结构变量可以作为一个整体被复制、赋值、传递给函有函数以及由函数返回。但不能将结构变量作为一个整体进行输入与输出。【例10-3】打印某一学生的成绩。将结构变量整体作为函数参数。#include stdio.h struct studentinfo long student_num;char name10;char sex;int age;float score;char addr30;void print_score(struct studentinfo st)pr
14、intf(%5.2f,st.score);main()struct studentinfo stu=990505,Li,M,18,85.7,Rm303 Bldg4;print_score(stu);,21,10.2指针在结构中的应用,一、指向结构体变量的指针 一个结构体变量的指针就是该变量所占据的内存段的首地址。指向结构体指针的定义,与结构体变量的定义完全类似。如:struct struct_name char name10;int num;float score;struc struct_name student,*p;,22,10.2指针在结构中的应用,赋值语句 p=,指针变量p指向结构体
15、变量student,引用结构体中的成员变量:(*p).成员名 或 p-成员名,相当于,student.成员名,student,23,说明:和成员运算符一样,“-”为指向运算符,是运算优先级最高的运算符。由于成员运算符“.”的运算优先级高于运算符“*”,因此(*p).成员名中()不能少。,*p.成员名,p=,不能用指向某个结构体变量的指针指向该结构体变量的某个成员。,10.2指针在结构中的应用,24,例10-4#include string.hmain()struct student long int num;char name20;char sex;float score;struct stu
16、dent stu_1,*p;p=,P,stu_1,占4字节,占4+20+1+4=29字节,10.2指针在结构中的应用,25,二、指向结构体数组的指针 例10-5 struct student long int num;char name20;char sex;int age;struct student stu3=10101,LiLin,M,18,10102,ZhangFun,M,19,10104,Wang Min,F,20;main()struct student*p;printf(No.Name sex agen);for(p=stu;p num,p-name,p-sex,p-age);,
17、10.2指针在结构中的应用,26,P=stu;指向stu0,判断P stu+3;,再打印 stu0;,P+;指向stu1,判断 P stu+3;,P+;指向stu2,P+;指向stu3,不存在,P,P,P,输出标题;,P,执行过程:,10.2指针在结构中的应用,27,注意以下两点:.若 p 的初值为 stu,即指向第一个元素,则 p+1指 向 下一个元素的起始地址.如:(+p)-num:先使 p自加 1,然后得到它指向的 元 素中的 num 成员值(即10102)。(p+)-num:先得到 p-num 的值(即10101),然后使 p自加 1,指向 stu1。.指针 p只能指向一个结构体型数据
18、(即 stu 数组的一个元素的起始地址),而不能指向一元素中的某一成员(即 p 的地址不能是成员的地址)。,注意:以下赋值语句都是错误的:,p=,(不能指向数组元素的成员变量),p=,(数组名本身就代表该数组的首地址,因此不能使用地址运算符&),10.2指针在结构中的应用,28,三、用指向结构体的指针作函数参数(不讲述)1、用结构体变量的成员作参数(值传递)2、用指向结构体变量(或数组)的指针作实参(地址传递)例10-6有一个结构体变量stu内含学生学号、姓名和三门课的成绩。要求在main函数中赋值,在另一函数print 中将它们输出。,10.2指针在结构中的应用,29,#include st
19、ring.h#define format%dn%sn%f n%f n%f n struct student int num;char name20;float score3;main()void print();struct student stu;stu.num=12345;strcpy(stu.name,Li Lin);stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(,void print(struct studnt*p)printf(format,p-num,p-name,p-score0,p-score1,p-score2);pr
20、intf(n);,P,stu,10.2指针在结构中的应用,30,其中 main 函数中最后一行调用 print 函数,也可改用print(stu);即实参改用结构体变量(而不是指针)。即void print(struct studnt*p)改为:void print(struct studnt stud)同时 print 函数也应相应改为:printf(format,stud.num,stud.name,stud.score0,stud.score1,stud.score2);printf(n);,10.2指针在结构中的应用,31,用指针处理链表,一、链表概述1、链表结构是一种动态结构,而数组
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学习 第十 结构

链接地址:https://www.31ppt.com/p-6503841.html