清华大学C语言谭浩强第7章.pptx
《清华大学C语言谭浩强第7章.pptx》由会员分享,可在线阅读,更多相关《清华大学C语言谭浩强第7章.pptx(127页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1清华大学清华大学C语言谭浩强第语言谭浩强第7章章第第7章章 复合结构类型复合结构类型n n7.1 7.1 结构体类型的概述结构体类型的概述 n n7.2 7.2 结构体类型的定义结构体类型的定义结构体类型的定义结构体类型的定义 n n7.3 7.3 结构体变量的定义及内存分配结构体变量的定义及内存分配结构体变量的定义及内存分配结构体变量的定义及内存分配 n n7.4 7.4 结构体变量的初始化和引用结构体变量的初始化和引用结构体变量的初始化和引用结构体变量的初始化和引用 n n7.5 7.5 结构体数组结构体数组 n n7.6 7.6 结构体变量和结构体数组成员的访问结构体变量和结构体
2、数组成员的访问结构体变量和结构体数组成员的访问结构体变量和结构体数组成员的访问 n n7.7 7.7 指向结构体类型数据的指针指向结构体类型数据的指针指向结构体类型数据的指针指向结构体类型数据的指针n n7.8 7.8 结构体型与函数结构体型与函数结构体型与函数结构体型与函数 n n7.9 7.9 用递归结构处理链表用递归结构处理链表 n n7.10 7.10 共用体型共用体型共用体型共用体型 n n7.11 7.11 枚举类型枚举类型枚举类型枚举类型 n n7.12 7.12 用用用用typedeftypedef定义类型定义类型定义类型定义类型 第1页/共127页7.1结构体类型的概述结构体
3、类型的概述n n所谓所谓“结构体类型结构体类型”是由不同数据类型变量组成的是由不同数据类型变量组成的集合体,相当于其他高级语言中的记录。集合体,相当于其他高级语言中的记录。n n结构体类型的数据由若干称为结构体类型的数据由若干称为“成员成员”的数据组成,的数据组成,每个成员既可以是一个基本数据类型的数据,也可每个成员既可以是一个基本数据类型的数据,也可以是另一个构造类型的数据。以是另一个构造类型的数据。n n例如:例如:定义一个婴儿的出生证明的结构体。定义一个婴儿的出生证明的结构体。struct babystruct baby char name20;/*char name20;/*婴儿姓名婴
4、儿姓名婴儿姓名婴儿姓名*/char sex;/*char sex;/*性别性别性别性别*/char date20;/*char date20;/*出生日期出生日期出生日期出生日期*/char num30;char num30;float weight float weight;/*/*出生时的体重出生时的体重出生时的体重出生时的体重*/char place30;/*char place30;/*出生地出生地出生地出生地*/;第2页/共127页7.2结构体类型的定义结构体类型的定义n n1.结构体类型的定义说明结构体类型的定义说明n n2.定义结构体类型时需要注意的问题定义结构体类型时需要注意的
5、问题n n3.结构体型的嵌套定义结构体型的嵌套定义第3页/共127页1.结构体类型的定义说明结构体类型的定义说明结构体类型定义的一般格式为:结构体类型定义的一般格式为:struct struct 结构体名结构体名 数据类型数据类型1 1 成员名成员名1;1;数据类型数据类型2 2 成员名成员名2;2;数据类型数据类型3 3 成员名成员名3;3;数据类型数据类型n n 成员名成员名n;n;第4页/共127页n n其中,其中,structstruct是关键字,是关键字,structstruct连同其后的结构体标识连同其后的结构体标识符一起称为结构体类型名或结构体名;符一起称为结构体类型名或结构体名
6、;n n结构体名是用户定义的标识符,其命名原则应符合结构体名是用户定义的标识符,其命名原则应符合标识符的书写规定;标识符的书写规定;n n数据类型可以是基本类型说明符,也可以是已定义数据类型可以是基本类型说明符,也可以是已定义过的结构体类型名,还可以是后面将要介绍的共用过的结构体类型名,还可以是后面将要介绍的共用体型等;体型等;n n成员名也是用户自定义的标识符,用来标识所包含成员名也是用户自定义的标识符,用来标识所包含的成员名称;的成员名称;n n各成员的定义语句放在花括号中;各成员的定义语句放在花括号中;n n花括号后面的分号是整个定义语句的结尾。花括号后面的分号是整个定义语句的结尾。第5
7、页/共127页例例7.17.1 将学籍管理记录定义成一个名为将学籍管理记录定义成一个名为struct struct studentstudent的结构体类型。的结构体类型。struct studentstruct student char number5,*name;/*char number5,*name;/*学号和姓名学号和姓名*/char sex;/*char sex;/*性别性别*/int age;/*int age;/*年龄年龄*/float score;/*float score;/*总分总分*/char*speciality /*char*speciality /*专业专业*/;
8、/;char school31;/*char school31;/*学校学校*/;第6页/共127页2.定义结构体类型时需要注意的问题定义结构体类型时需要注意的问题(1 1)类型与变量是不同的概念,不要混淆。)类型与变量是不同的概念,不要混淆。)类型与变量是不同的概念,不要混淆。)类型与变量是不同的概念,不要混淆。(2 2)每个成员都必须有自己的数据类型。)每个成员都必须有自己的数据类型。)每个成员都必须有自己的数据类型。)每个成员都必须有自己的数据类型。(3 3)结构体中的成员可以单独使用。)结构体中的成员可以单独使用。)结构体中的成员可以单独使用。)结构体中的成员可以单独使用。(4 4)结
9、构体成员可以和程序中的其他标识符同名,也可)结构体成员可以和程序中的其他标识符同名,也可)结构体成员可以和程序中的其他标识符同名,也可)结构体成员可以和程序中的其他标识符同名,也可以和另一个结构体的成员同名。以和另一个结构体的成员同名。以和另一个结构体的成员同名。以和另一个结构体的成员同名。(5 5)结构体类型定义的位置,可以在函数内部,也可以)结构体类型定义的位置,可以在函数内部,也可以)结构体类型定义的位置,可以在函数内部,也可以)结构体类型定义的位置,可以在函数内部,也可以在函数外部。在函数外部。在函数外部。在函数外部。(6 6)结构体中的成员名可以与程序中的变量名相同,但)结构体中的成
10、员名可以与程序中的变量名相同,但)结构体中的成员名可以与程序中的变量名相同,但)结构体中的成员名可以与程序中的变量名相同,但两者并不代表同一对象。两者并不代表同一对象。两者并不代表同一对象。两者并不代表同一对象。(7 7)注意结构体和数组之间的区别:)注意结构体和数组之间的区别:)注意结构体和数组之间的区别:)注意结构体和数组之间的区别:数组里放的都是类型相同的数据(例如在一个箱子里数组里放的都是类型相同的数据(例如在一个箱子里数组里放的都是类型相同的数据(例如在一个箱子里数组里放的都是类型相同的数据(例如在一个箱子里放的全是苹果)放的全是苹果)放的全是苹果)放的全是苹果);而结构体中可以放不
11、同类型的数据(例如在一个箱子而结构体中可以放不同类型的数据(例如在一个箱子而结构体中可以放不同类型的数据(例如在一个箱子而结构体中可以放不同类型的数据(例如在一个箱子里既放有苹果,又放有桃、香蕉等不同的水果)。里既放有苹果,又放有桃、香蕉等不同的水果)。里既放有苹果,又放有桃、香蕉等不同的水果)。里既放有苹果,又放有桃、香蕉等不同的水果)。第7页/共127页3.结构体型的嵌套定义结构体型的嵌套定义n n结构体型的定义可以嵌套,即某个结构体型成员的结构体型的定义可以嵌套,即某个结构体型成员的数据类型可以说明为另一个已定义过的结构体类型。数据类型可以说明为另一个已定义过的结构体类型。n n例如将上
12、面定义的结构体类型中的成员例如将上面定义的结构体类型中的成员“age”age”改为出生改为出生日期日期“birthday”birthday”。n n由于出生日期包含年、月、日三个整型数据,可以将它由于出生日期包含年、月、日三个整型数据,可以将它定义成另外一个名为定义成另外一个名为struct datestruct date的结构体类型的变量,并的结构体类型的变量,并将该变量作为结构体类型将该变量作为结构体类型struct studentstruct student的一个成员,即的一个成员,即struct datestruct date int year;int year;int month;i
13、nt month;int day;int day;第8页/共127页/*struct student/*struct student 结构体的定义如下结构体的定义如下*/struct student struct student char num5,*name;char num5,*name;char sex;char sex;struct date birthday;struct date birthday;float score;float score;char*speciality;char*speciality;char school31;char school31;也可以写成嵌套定义
14、的形式:也可以写成嵌套定义的形式:第9页/共127页struct studentstruct student char number5,*name;char number5,*name;char sex;char sex;struct date struct date int year;int year;int month;int month;int day;int day;birthday;birthday;float score;float score;char*speciality;char*speciality;char school31;char school31;第10页/共127
15、页7.3结构体变量的定义及内存分配结构体变量的定义及内存分配n n7.3.1 结构体变量的定义结构体变量的定义n n7.3.2 结构体类型的内存分配模式结构体类型的内存分配模式第11页/共127页7.3.1结构体变量的定义结构体变量的定义n n1.先定义结构体,后定义变量先定义结构体,后定义变量n n2.在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量n n3.直接说明结构体变量直接说明结构体变量第12页/共127页1.先定义结构体,后定义变量先定义结构体,后定义变量n n例如,为学生信息定义两个变量例如,为学生信息定义两个变量mm和和n n,程序如,程序如下:下:struct s
16、tudentstruct student int num;int num;char name20;char name20;int age;int age;char sex;char sex;char place20;char place20;struct student m,n;/*struct student m,n;/*定义结构体变量定义结构体变量mm和和n*/n*/第13页/共127页n n上述程序就说明了两个上述程序就说明了两个struct student struct student 型的变量型的变量mm和和n n为。为。n n也可以在定义变量的同时,对变量赋初值,例如,也可以在定义
17、变量的同时,对变量赋初值,例如,上面的例子中定义的语句可以改写成如下赋初值的上面的例子中定义的语句可以改写成如下赋初值的形式:形式:struct student m=20041,“wangtai”,18,m,“struct student m=20041,“wangtai”,18,m,“江西江西江西江西,n=20043,zhaoli,16,f,n=20043,zhaoli,16,f,福建福建福建福建;n n这种方法是将类型定义和变量定义分别进行的,是这种方法是将类型定义和变量定义分别进行的,是一种比较常用的定义方法。一种比较常用的定义方法。第14页/共127页2.在定义结构体类型的同时定义变量
18、在定义结构体类型的同时定义变量n n这种方法是在说明结构体变量的同时定义结构体这种方法是在说明结构体变量的同时定义结构体变量。这种形式定义的一般格式为:变量。这种形式定义的一般格式为:struct struct 结构体名结构体名结构体名结构体名 成员列表成员列表成员列表成员列表 变量名列表变量名列表变量名列表变量名列表;第15页/共127页3.直接说明结构变量直接说明结构变量n n直接说明结构体类型变量的一般格式为:直接说明结构体类型变量的一般格式为:struct struct 成员表列成员表列成员表列成员表列 变量名表列变量名表列变量名表列变量名表列;n n这种方法与第二种方法的区别在于第三
19、种方法中省去了结构体名,这种方法与第二种方法的区别在于第三种方法中省去了结构体名,而在后面直接给出结构体变量。而在后面直接给出结构体变量。第16页/共127页n n例如:例如:structstruct int num;int num;char name20;char name20;int age;int age;char sex;char sex;char place20;char place20;m=20041,wangtai,18,m,m=20041,wangtai,18,m,江西江西,n=20043,zhaoli,16,f,n=20043,zhaoli,16,f,福建福建;第17页/共1
20、27页7.3.2结构体类型的内存分配模式结构体类型的内存分配模式n n结构体类型的内存分配模式随该类型中包含的成员不同而不同,结构体类型的内存分配模式随该类型中包含的成员不同而不同,需要的内存字节数等于各个成员所需要的内存字节数的总和。需要的内存字节数等于各个成员所需要的内存字节数的总和。n n一旦定义了结构体类型的变量或数组后,就要按这种结构体类型一旦定义了结构体类型的变量或数组后,就要按这种结构体类型的内存分配模式占用内存。的内存分配模式占用内存。第18页/共127页n n7.4.1 结构体变量的初始化结构体变量的初始化n n7.4.2 结构体变量的引用结构体变量的引用7.4结构体变量的初
21、始化和引用结构体变量的初始化和引用第19页/共127页7.4.1.结构体变量的初始化结构体变量的初始化n n结构体变量的初始化形式与前面介绍的数组相似,只要把对应各结构体变量的初始化形式与前面介绍的数组相似,只要把对应各成员的初值放在花括号(即初值表)中即可。成员的初值放在花括号(即初值表)中即可。第20页/共127页例例7.27.2 结构体变量的初始化。结构体变量的初始化。#include#includestruct studentstruct student int number;int number;char name20;char name20;char sex;char sex;st
22、ruct date struct date int year;int month;int day;int year;int month;int day;birthday;birthday;float score;float score;char speciality11;char speciality11;char school31;char school31;第21页/共127页main()main()struct student st1=1001,Liming,0,1983,10,25,573,struct student st1=1001,Liming,0,1983,10,25,573,
23、Computer,3th High School,Beijing;Computer,3th High School,Beijing;/*/*结构体变量结构体变量st1st1的定义和初始化的定义和初始化*/printf(%4d%-10s%c%4d%2d%2d%.2f%-10s%sn,printf(%4d%-10s%c%4d%2d%2d%.2f%-10s%sn,st1.number,st1.name,st1.sex,st1.birthday.year,st1.number,st1.name,st1.sex,st1.birthday.year,st1.birthday.month,st1.birth
24、day.day,st1.score,st1.birthday.month,st1.birthday.day,st1.score,st1.speciality,st1.school);st1.speciality,st1.school);/*/*输出结构体变量输出结构体变量st1st1的各数据项的各数据项*/程序运行结果为:程序运行结果为:1001 Liming 0 1983 10 25 573.00 Computer 3th High school,Beijing第22页/共127页n n结构体变量初始化后,结构体变量初始化后,C C编译系统按结构体成员的顺编译系统按结构体成员的顺序将各个初值
25、置于各成员对应的存储单元,如表序将各个初值置于各成员对应的存储单元,如表7-27-2所示。所示。表表7-2 结构体变量初始化存储示意结构体变量初始化存储示意numbernamesexyearmonthdayscorespecialityschool1001Liming01983102573Computer3th High School,Beijing注意:对结构体变量初始化时,不允许跳过前面的成员只给后面的成员赋初值,但可以只给前面的成员赋初值,后面未赋初值的成员自动赋零值(字符型数组赋空串)。第23页/共127页7.4.2 结构体变量的引用结构体变量的引用n n不能直接使用结构体变量,只能通
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 清华大学 语言 谭浩强第
限制150内