C语言程序设计教程(第2版)课件第11章

上传人:zw****58 文档编号:53670258 上传时间:2018-09-03 格式:PPT 页数:48 大小:491KB
返回 下载 相关 举报
C语言程序设计教程(第2版)课件第11章_第1页
第1页 / 共48页
C语言程序设计教程(第2版)课件第11章_第2页
第2页 / 共48页
C语言程序设计教程(第2版)课件第11章_第3页
第3页 / 共48页
C语言程序设计教程(第2版)课件第11章_第4页
第4页 / 共48页
C语言程序设计教程(第2版)课件第11章_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《C语言程序设计教程(第2版)课件第11章》由会员分享,可在线阅读,更多相关《C语言程序设计教程(第2版)课件第11章(48页珍藏版)》请在金锄头文库上搜索。

1、第11章 复杂数据类型,本章要点 理解结构体的含义、定义与使用方法 理解共用体的含义、定义与使用方法 理解枚举类型的含义、定义与使用方法 理解typedef的作用与使用方法 掌握链表操作的基本方法 本章难点 有关链表的操作 用结构体变量和指向结构体的指针作函数参数,概述,有时,需将不同类型的数据组合成一个有机的整体,以便于引用。这些数据是相互联系的。如一个学生的有关信息:,可采用结构体数据结构描述上述信息。,11.1 结构体,例如:,struct student int num;char name20;char sex;int age;char addr30; ;,定义一个结构体类型的一般形式

2、为:,struct 结构体名成员表列;,对各成员都要进行类型说明; 成员名定名规则与变量名同。,是类型,不是变量名,11.1.1 结构体类型的声明,声明的一般形式为: struct 结构名 成员1的说明; 成员2的说明; 成员n的说明; ;,struct medicine char code; /*药品代号*/char name; /*药品名称*/float price; /*单价*/char place; /*产地*/stuct goods caption ;/*来源地*/ ;,用宏定义的模式:#define stu struct studentstu成员1的说明;成员2的说明;成员n的说明

3、;,11.1.2 结构体变量,方法一:先定义结构体类型再定义变量名 struct student int num;char name20;char sex;int age;char addr30; ; struct student student1, student2;,定义studet1和 sudent2为 struct student 类型变量,不能只指定一个变 量为“struct型”而不 指定结构体名,有时,可用符号常量代表一个结构体类型,如:,#define STUDENT struct student STUDENT int num;char name20;char sex;int

4、age;char addr30; ;,这样,可直接用STUDENT 定义变量,如: STUDENT student1, student2; 此时,不必再写关键字struct,方法二:在定义类型的同时定义变量,如:,struct student int num;char name20;char sex;int age;char addr30; student1, student2;,一般形式是: struct 结构体名成员表列变量名表列;,方法三:直接定义结构类型变量。,其一般形式是: struct成员表列变量名表列;,此时,不出现结构体名,结构体变量的存储,struct test int m1

5、10; char m2; float m3; double m4; aa;,sizeof(struct test)的值为 2*10+1+4+8=33,一个结构体变量所占用内存空间的字节数可以用sizeof运算符求出,它的一般形式为:,sizeof(变量名或类型标识符);,几点说明:,1. 类型与变量是不同概念,不要混淆; 2. 结构体中的成员,可以单独使用,其作 用与地位相当于普通变量; 3. 成员也可以是一个结构体变量;例如:,struct dateint month;int day;int year;,Struct student int num; char name20; int age

6、; struct date birthday; student1,student2;,4. 成员名可以与程序中的变量名相同,二者不代表同一对象。,11.1.3 结构体变量的引用与初始化,规则: 1. 不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出(引用形式为:结构体变量名.成员名)。 printf(“”,student1); printf(“ %d”, student1.num); 输出 10010,错!,正确!,2 .若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。如:student1.birthday.year (下页续),(接上片),3.

7、 对成员变量可以象普通变量一样进行各种运算,如:sumage=student1.age+student2.age; 4. 可以引用成员的地址,也可以引用结构体变量的地址,如scanf(“%d”,错!,输入student1.num的值,输出student1的首地址,结构体变量的初始化,(一)对外部存储类型的结构体变量初始化:struct student long int num;char name20;char sex;char addr20; a=9801,”Wang hong”,W,”2 Linggong Road”;main( ) printf(“No.:%ldnname:%snsex:%

8、cnaddress:%sn”,a.num,a.name,a.sex,a.addr); ,运行结果为: No.:9801 name:Wang hong sex:W address:2 Linggong Road,(二)对静态存储类型的结构体变量初始化,如:,main( ) static struct student long int num;char name20;char sex;char addr20; a=9801,”Wang hong”,W,”2 Linggong Road”; printf(“No.:%ldnname:%snsex:%cnaddress:%sn” , a.num,a.n

9、ame,a.sex,a.addr); ,11.1.4 结构体数组 (每个数组元素都是一个结构体类型的数据),(一)结构体数组的定义,如 struct student int num;char name20;char sex;int age;char addr30; ;struct studnt stu3;,也可直接定义,如 struct studentint num; stu3; 或structint num;stu3;,(二)结构体数组的初始化(只能对全局的或静态存储类别的数组初始化),struct student int num;char name20;char sex; int age;

10、char addr30; stu3=111,”Li”,M,18,”Dalian”,;也可采用:struct studentint num;struct student stu=,;,结构体数组的初始化的一般形式是在 定义数组后面加上: =初值表列;,例题:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。 struct person char name20;int count;leader3=“Li”,0,”zhang”,0,”Liu”,0;main( ) int i, j;char leader_name20;for( i=1;i=10;i+) scanf(“%s”,

11、leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)= =0)leaderj.count+);for(i=0;i成员名,指向运算符。其优先级高于自增、自减运算符,试分析以下运算: p-n 得到p指向的结构体变量中的成员n的值 p-n+ 得到p指向的结构体变量中的成员n的值,用完后使它加1; +p-n 得到p指向的结构体变量中的成员n的值使其先加1,2指针变量的引用,指向结构数组的指针变量,我们知道,数组和指针有密切的关系。同样,结构数组和结构数组指针也紧密相关。当定义一个结构数组后,我们还可以定义一个结构指针变量,使该指针

12、变量指向这个数组。那么,程序中既可以利用数组下标访问一个数组元素,也可以通过指针变量的操作来存取结构数组元素。 例如,定义一个结构类型worker和结构数组class: struct worker char name20; float salary; int age; int num12; ; struct worker class10; struct worker *pa;pa= /*指针变量pa指向结构体数组的首地址*/,定义stu1是类型为struct student的结构体变量,pa是可以指向该类型对象的指针变量。但应该注意的是:经过上面的定义,此时pa尚未指向任何具体的对象。为使pa

13、指向stu1,必须把stu1的地址赋给pa:pa= 注意,在定义了*pa之后,应该知道: (1) *pa不是结构变量,因此不能写成pa.ave,必须加上圆括号(*ps).ave。为此,C语言引入一个指向运算符“”,连接指针变量与其指向的结构体变量的成员。“”为间接成员运算符,其一般引用的格式为:指针变量名结构成员名 说明:运算符“”是由连字符和大于号组成的字符序列,它们要连在一起使用。C语言把它们作为单个运算符使用。所以我们可以将(*ps).ave改写为psave。 (2) pa只能指向一个结构体变量,而不能指向结构体变量中的一个成员。(3) 指向运算符“”的优先级别最高,,11.1.6 结构

14、体与函数,1结构体作为函数参数 结构体变量做函数参数有三种方法: 一是,C语言允许用结构变量的成员做函数参数 例如: struct stu float score; stu1; void show(stu1.score) void show(float x) 语句序列; 二是,C语言允许用结构变量做函数的参数 例如:show(stu1) 三是,结构指针做函数参数。,和普通变量一样,结构体变量作为函数参数,用于在函数之间传递数据。同时,函数的返回值也可以是结构变量。结构变量作函数参数的传递方式与简单变量作函数参数的处理方式完全相同,即采用值传递的方式,形参结构变量中各成员值的改变,对相应实参结构变量不产生任何影响,但在函数定义时需要对其类型进行相应的说明。如:int get_month(x)struct month x;x.day=25; 它说明了形参x是struct month型结构变量。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号