精品《C语言程序设计第11章结构体与共用体》PPT课件.ppt
《精品《C语言程序设计第11章结构体与共用体》PPT课件.ppt》由会员分享,可在线阅读,更多相关《精品《C语言程序设计第11章结构体与共用体》PPT课件.ppt(102页珍藏版)》请在三一办公上搜索。
1、,第十一章,结构体与共用体,主要内容,11.1 概述11.2 定义结构体类型变量的方法11.3 结构体变量的引用11.4 结构体变量的初始化11.5 结构体数组 11.指向结构体类型数据的指针 11.7 用指针处理链表11.8 共用体 11.9 枚举类型 11.10 用typedef定义类型,11.1 概述,声明一个结构体类型的一般形式为:struct 结构体名 成员表列;如:struct student int num;char name20;char sex;int age;float score;char addr30;,结构体名,类型名,成员名,11.2 定义结构体类型变量的方法,(1
2、)先定义结构,再说明结构变量。如:struct stu int num;char name20;char sex;float score;struct stu boy1,boy2;,11.2 定义结构体类型变量的方法,(1)先定义结构,再说明结构变量。也可以用宏定义使一个符号常量来表示一个结构类型。例如:#define STU struct stu STU int num;char name20;char sex;float score;STU boy1,boy2;,11.2 定义结构体类型变量的方法,(2)在声明类型的同时定义变量例如:struct stu int num;char name
3、20;char sex;float score;boy1,boy2;,这种形式的定义的一般形式为:struct结构体名 成员表列 变量名表列;,11.2 定义结构体类型变量的方法,(3)直接说明结构变量例如:struct int num;char name20;char sex;float score;boy1,boy2;,这种形式的说明的一般形式为:struct 成员表列变量名表列;,11.2 定义结构体类型变量的方法,它们都具有同样的结构:,11.2 定义结构体类型变量的方法,嵌套的结构:,struct date int month;int day;int year;,struct int
4、 num;char name20;char sex;struct date birthday;float score;boy1,boy2;,11.3结构体变量的引用,在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则:不能将一个结构体变量作为一个整体进行输入和输出。例如:已定义student1和student2为结构体变量并且它们已有值。printf(%d,%s,%c,%d,%f,%n,student1);,11.3结构体变量的引用,引用结构体变量中成员的方式为结构体变量名.成员名例如,student1.num表示student1变量中的num成员,即student1的num(学号
5、)项。可以对变量的成员赋值,例如:student1.num=10010;“.”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待。上面赋值语句的作用是将整数10010赋给student1变量中的成员num。,11.3结构体变量的引用,可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如:scanf(%d,(输入student1.num的值)printf(%o,student1);(输出student1的首地址),11.3结构体变量的引用,但不能用以下语句整体读入结构体变量,例如:scanf(%d,s,c,d,f,s,student
6、1);结构体变量的地址主要用作函数参数,传递结构体变量的地址。,11.4结构体变量的赋值,结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。【例11.1】给结构变量赋值并输出其值。main()struct stu int num;char*name;char sex;float score;boy1,boy2;,11.4结构体变量的赋值,boy1.num=102;boy1.name=Zhang ping;printf(input sex and scoren);scanf(%c%f,11.4结构体变量的赋值,本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针
7、变量。用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。,11.5 结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。,11.5 结构体数组,11.5.1 定义结构体数组,和定义结构体变量的方法相仿,只需说明为数组即可,例如:struct student
8、int num;char name20;char sex;int age;float score;char addr30;struct student stu3;,11.5 结构体数组,11.5.1 定义结构体数组,以上定义了一个数组stu,数组有3个元素,均为struct student类型数据,也可以直接定义一个结构体数组,例如:struct student int num;stu3;或者struct int num;stu3;,11.5 结构体数组,11.5.2 结构体数组的初始化,与其他类型的数组一样,对结构体数组可以初始化。例如:struct student int num;char
9、 name20;char sex;int age;float score;char addr30;stu3=10101,”Li Lin”,M,18,87.5,”103 Beijing Road”,10102,”Zhang Fun”,M,19.99,”130 Shanghai Road”;,11.5 结构体数组,11.5.2 结构体数组的初始化,同样数组个数可以不指定:stu=10101,”Li Lin”,M,18,87.5,”103 Beijing Road”,10102,”Zhang Fun”,M,19.99,”130 Shanghai Road”;,11.5 结构体数组,11.5.3 结构
10、体数组应用举例,例11.2对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include#include struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,“Fun”,0,11.5 结构体数组,11.5.3 结构体数组应用举例,void main()int i,j;char leader-name20;for(i=0;i=10;i+)scanf(“%s”,leader-name);for(j=0;j3;j+)if(strcmp(leader-name,leaderj.na
11、me)=0)leaderj,count+;printf(“n”);for(i=0;i3;i+)printf(“%5s:%dn”,leaderi.name,leaderi.count);,11.6 指向结构体类型数据的指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。,11.6 指向结构体类型数据的指针,11.6.1 指向结构体变量的指针,一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可
12、访问该结构变量,这与数组指针和函数指针的情况是相同的。结构指针变量说明的一般形式为:struct 结构名*结构指针变量名例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:struct stu*pstu;,11.6 指向结构体类型数据的指针,11.6.1 指向结构体变量的指针,当然也可在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则:pstu=&boy pstu=&stu哪个是正确的,哪个
13、是错误的?,11.6 指向结构体类型数据的指针,11.6.1 指向结构体变量的指针,结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。因此上面&stu这种写法是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就能更方便地访问结构变量的各个成员。,11.6 指向结构体类型数据的指针,11.6.1 指向结构体变量的指针,其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量-成员名例如:(*pstu).num或者:pstu-num应该注意(*pstu)两侧的括号不可少
14、,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。,11.6 指向结构体类型数据的指针,【例11.3】下面通过一个简单例子来说明指向结构体变量的指针变量的应用。,struct stu int num;char*name;char sex;float score;boy1=102,Zhang ping,M,78.5,*pstu;,11.6 指向结构体类型数据的指针,main()pstu=,11.6 指向结构体类型数据的指针,三种等价的形式:结构体变量.变量名(*)p.成员名p-成员名,请分析一下几种运算:p-np-n+p
15、-n,11.6 指向结构体类型数据的指针,例11.4 指向结构体数组的指针的应用,11.6.2 指向结构体数组的指针,#include struct studentint num;char name20;char sex;int age;);struct student stu3=10101,”Li Lin”,M,18,10102,”Zhang Fun”,M,19,10104,”Wang Min”,F,20;,11.6 指向结构体类型数据的指针,11.6.2 指向结构体数组的指针,void main()struct student*p;printf(“No.Name sex agen”);fo
16、r(p=stu;pnum,p-name,p-sex,p-age);,11.6 指向结构体类型数据的指针,11.6.3 用结构体变量和指向结构体的指针 作函数参数 将一个结构体变量的值传递给另一个函数,有3个方法:用结构体变量的成员作参数。(2)用结构体变量作实参。(3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,11.6 指向结构体类型数据的指针,例115 有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。要求在main函数中赋予值,在另一函数print中将它们输出。,11.6.3 用结构体变量和指向结构体的指针作函数参数,#include#inc
17、lude#define FORMAT“%dn%sn%fn%fn%fn”struct studentint num;char name20;float score3;,11.6 指向结构体类型数据的指针,11.6.3 用结构体变量和指向结构体的指针作函数参数,void main()void print(struct student);struct student stu;stu.num=12345;strcpy(stu.name,”Li Li”);stu.score0=67.5;stu.score1=89;stu.score2=78.5;print(stu);,11.6 指向结构体类型数据的指针
18、,11.6.3 用结构体变量和指向结构体的指针作函数参数,void print(struct student stu)printfFORMAT,stu.num,stu.name,stu.score0,stu.score1,stu.score2);printf(“n”);,11.6 指向结构体类型数据的指针,11.6.3 用结构体变量和指向结构体的指针作函数参数,#include#include#define FORMAT“%dn%sn%fn%fn%fn”struct studentint num;char name20;float score3;stu=12345,”Li Li”,67.5,8
19、9,78.6;,例116 将上题改为指向结构体变量的指针作实参。,11.6 指向结构体类型数据的指针,11.6.3 用结构体变量和指向结构体的指针作函数参数,void main()void print(struct student*);print(,11.7 用指针处理链表,链表概述,动态存储的方法:有一个学生就分配一个结点,无须预先确定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。即在结点结构中定义一
20、个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。,11.7 用指针处理链表,链表概述,可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放第三个结点的首地址,如此串连下去直到最后一个结点。最后一个结点因无后续结点连接,其指针域可赋为0。这样一种连接方式,在数据结构中称为“链表”。下图为最一简单链表的示意图。,11.7 用指针处理链表,链表概述,链表的基本操作对链表的主要操作有以下几种:建立链表;结构的查找与输出;插入一个结点;删除一个结点;,11.7 用指针处理链表,简单链表,【例11.7】建立一个如图所示的简单链表,它由3个学生数据的结点组
21、成。输出各结点中的数据。,10101,89.5,10103,90,10107,85,numscorenext,#include#define NULL 0struct studentlong num;float score;struct student*next;void main()struct student a,b,c,*head,*p;a.num=10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;,head=,输出结果:,11.7 用指针处理链表,处理动态链表所需的函数 库函数提供动态地开辟和释放存储单元的
22、有关函数:malloc函数其函数原型为void*malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。,11.7 用指针处理链表,(2)calloc函数 其函数原型为void*calloc(unsigned,unsigned size);其作用是在内存的动态存储区中分配个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。用calloc函数可以为一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计第11章结构体与共用体 精品 语言程序设计 11 结构 共用 PPT 课件

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