《清华大学C语言谭浩强第7章.pptx》由会员分享,可在线阅读,更多相关《清华大学C语言谭浩强第7章.pptx(127页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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不能直接使用结构体变量,只能通
26、过引用其中的成不能直接使用结构体变量,只能通过引用其中的成员来实现对结构体变量的使用。员来实现对结构体变量的使用。n n引用结构体变量成员的一般形式为:引用结构体变量成员的一般形式为:结构体变量名结构体变量名结构体变量名结构体变量名.成员名成员名成员名成员名n n例如:例如:“m.num”m.num”表示表示mm变量中的变量中的numnum成员,即成员,即mm的的numnum成员项。成员项。n n如果成员本身又是一个结构体,则必须逐级找到最如果成员本身又是一个结构体,则必须逐级找到最低级的成员才能使用。例如:低级的成员才能使用。例如:“m.birthday.month”m.birthday.m
27、onth”表示表示mm变量中的变量中的birthdaybirthday成员成员中的中的monthmonth成员,即成员,即mm变量出生的月份成员可以在程变量出生的月份成员可以在程序中单独使用,与普通变量的使用完全相同。序中单独使用,与普通变量的使用完全相同。第24页/共127页例例7.37.3结构体变量成员的引用。结构体变量成员的引用。#include string.h#include string.hstruct student struct student /*/*定义定义studentstudent类型的变量类型的变量*/int num;int num;char name20;char
28、name20;char sex;char sex;float score;float score;main()main()struct student m;struct student m;m.num=20048;m.num=20048;/*/*给结构体变量给结构体变量x x的成员的成员numnum赋值赋值*/strcpy(m.name,zhangsan);strcpy(m.name,zhangsan);/*/*用用strcpystrcpy给结构体变量给结构体变量x x的成员的成员name name 赋值赋值*/第25页/共127页 m.sex=f;m.sex=f;/*/*给结构体变量给结构体
29、变量x x的成员的成员sexsex赋值赋值*/m.score=95;m.score=95;/*/*给结构体变量给结构体变量x x的成员的成员scorescore赋值赋值*/printf(num=%d name=%s sex=%c score=%f,m.num,m.name,printf(num=%d name=%s sex=%c score=%f,m.num,m.name,m.sex,m.score);m.sex,m.score);/*/*输出结构体变量输出结构体变量mm的各数据项的值的各数据项的值*/该程序的运行结果如下:num=20048 name=zhangsan sex=f score
30、=95.000000第26页/共127页7.5结构体数组结构体数组n n7.5.1结构体数组的定义结构体数组的定义n n7.5.2结构体数组的初始化结构体数组的初始化第27页/共127页7.5.1结构体数组的定义结构体数组的定义n n1.间接定义间接定义n n2.直接定义直接定义第28页/共127页1.间接定义间接定义n n先定义结构体类型,再用结构体类型名定义该类先定义结构体类型,再用结构体类型名定义该类型的数组,这是一种间接定义的方式。型的数组,这是一种间接定义的方式。n n例如:例如:struct studentstruct student int num;int num;char na
31、me20;char name20;char sex;char sex;float score;float score;struct student stu 3;struct student stu 3;第29页/共127页2.直接定义直接定义n n在定义结构体类型的同时定义该类型的数组,这在定义结构体类型的同时定义该类型的数组,这是一种直接定义的方式。是一种直接定义的方式。n n例如:例如:struct studentstruct student char number5,*name;char number5,*name;char sex;char sex;struct date int ye
32、ar;int month;int day;birthday;struct date int year;int month;int day;birthday;float score;float score;char*speciality;char*speciality;char school31;char school31;st1,st210,*p1;st1,st210,*p1;第30页/共127页n n在直接定义时,也可以在在直接定义时,也可以在structstruct后面不带结构体标识后面不带结构体标识符,这种结构体类型称为无名结构体类型。例如:符,这种结构体类型称为无名结构体类型。例如:s
33、tructstruct char number5,*name;char number5,*name;char sex;char sex;struct date struct date int year;int month;int day;int year;int month;int day;birthday;birthday;float score;float score;char*speciality;char*speciality;char school31;char school31;st1,st210,*p1;st1,st210,*p1;第31页/共127页n n说明:有名结构体类型和
34、无名结构体类型比较:说明:有名结构体类型和无名结构体类型比较:(1 1)有名结构体类型的类型名可以使用多次,可)有名结构体类型的类型名可以使用多次,可以用它去定义其他的同类型变量、数组或指针。以用它去定义其他的同类型变量、数组或指针。(2 2)无名结构体类型只能使用一次,不能用无名)无名结构体类型只能使用一次,不能用无名结构体类型再去定义其他的变量、数组或指针。结构体类型再去定义其他的变量、数组或指针。第32页/共127页7.5.2结构体数组的初始化结构体数组的初始化n n结构体数组的初始化相当于给若干个结构体变量初始化,只要将结构体数组的初始化相当于给若干个结构体变量初始化,只要将各个元素的
35、初值顺序放在内嵌的花括号中即可。当整个数组的各各个元素的初值顺序放在内嵌的花括号中即可。当整个数组的各个元素都有初始化数据时,内嵌花括号也可以省略。个元素都有初始化数据时,内嵌花括号也可以省略。例例7.57.5以三个学生为例以三个学生为例计算学生的平均成绩和及格人数。计算学生的平均成绩和及格人数。#include#includestruct studentstruct student int num;int num;char name20;char name20;char sex;char sex;第33页/共127页 float score;float score;stu3=11,Liang
36、 tao,t,80,13,Zhao jun,f,97.5,14,stu3=11,Liang tao,t,80,13,Zhao jun,f,97.5,14,Hai kang,f,58;Hai kang,f,58;/*/*定义结构体数组并初始化各个数据项的内容定义结构体数组并初始化各个数据项的内容*/main()main()int i,j=0;int i,j=0;float average,sum=0;float average,sum=0;for(i=0;i3;i+)for(i=0;i=60)j+=1;if(stui.score=60)j+=1;/*/*统计及格人数统计及格人数*/printf(
37、the sum is%fn,sum);printf(the sum is%fn,sum);average=sum/3;average=sum/3;/*/*求平均成绩求平均成绩*/printf(the average is%fncount=%dn,average,j);printf(the average is%fncount=%dn,average,j);该程序的最后运行结果如下:该程序的最后运行结果如下:the sum is=235.500000the average is=78.500000count=2第34页/共127页7.6 7.6 结构体变量和结构体数组成员的访问结构体变量和结构体
38、数组成员的访问结构体变量和结构体数组成员的访问结构体变量和结构体数组成员的访问n n7.6.1访问结构体成员运算符访问结构体成员运算符n n7.6.2 访问结构体成员的方法访问结构体成员的方法第35页/共127页7.6.1访问结构体成员运算符访问结构体成员运算符n n1.“.”运算符运算符n n2.“”运算符运算符第36页/共127页1.“.”运算符运算符n n“.”运算符称点运算符。运算符称点运算符。n n当用结构体变量名或结构体数组元素访问其成员时,要用当用结构体变量名或结构体数组元素访问其成员时,要用“.”.”运运算符。算符。n n例如:例如:“m.age”m.age”表示访问表示访问m
39、m的成员的成员ageage的值。的值。第37页/共127页2.“”运算符运算符n n“”运算符由一个减号和一个大于号组成。运算符由一个减号和一个大于号组成。n n当用结构体指针或结构体数组名等地址量访问其成员时,要用当用结构体指针或结构体数组名等地址量访问其成员时,要用“”运算符。运算符。n n例如例如:n n(n+1)n+1)ageage表示访问表示访问n1n1的成员的成员ageage的值。的值。n n说明:说明:说明:说明:“.”运算符和运算符和运算符和运算符和“-”运算符都是二元运算符,它们和运算符都是二元运算符,它们和运算符都是二元运算符,它们和运算符都是二元运算符,它们和“()”、“
40、”一起处于最高优先级,结合性均为从左至右。一起处于最高优先级,结合性均为从左至右。一起处于最高优先级,结合性均为从左至右。一起处于最高优先级,结合性均为从左至右。第38页/共127页7.6.2 访问结构体成员的方法访问结构体成员的方法n n1.访问结构体变量的成员访问结构体变量的成员n n2.访问结构体数组元素的成员访问结构体数组元素的成员第39页/共127页1.访问结构体变量的成员访问结构体变量的成员n n若已定义了一个结构体变量及指向它的指针,可以使用以下三种若已定义了一个结构体变量及指向它的指针,可以使用以下三种方法访问该结构体变量的成员:方法访问该结构体变量的成员:结构体变量名结构体变
41、量名.成员名成员名结构体指针名结构体指针名成员名成员名(*(*结构体指针名结构体指针名).).成员名成员名第40页/共127页2.访问结构体数组元素的成员访问结构体数组元素的成员n n若已定义了一个结构体数组及指向它的指针,若已定义了一个结构体数组及指向它的指针,n n则可以用数组名(相当于指针)、数组元素名则可以用数组名(相当于指针)、数组元素名(相当于变量)或指向该数组的指针,并通过相(相当于变量)或指向该数组的指针,并通过相应的运算符应的运算符“.”.”或或“”来访问该数组元素的各来访问该数组元素的各个成员。个成员。n n主要有以下几种形式:主要有以下几种形式:结构体数组元素结构体数组元
42、素.成员名成员名结构体数组名结构体数组名成员名成员名结构体指针名结构体指针名成员名成员名(*(*结构体指针名结构体指针名).).成员名成员名第41页/共127页3.访问嵌套的结构体成员访问嵌套的结构体成员n n若结构体成员是内嵌的结构体时,必须用若干个若结构体成员是内嵌的结构体时,必须用若干个“.”.”或或“”来来顺序地逐层定位到最里层的成员。顺序地逐层定位到最里层的成员。n n假设有一个结构体变量及指向它的结构体指针,该结构体变量的假设有一个结构体变量及指向它的结构体指针,该结构体变量的成员含有另一个结构体变量,则访问内嵌成员的形式有以下几种:成员含有另一个结构体变量,则访问内嵌成员的形式有
43、以下几种:结构体变量名结构体变量名.内嵌结构体变量名内嵌结构体变量名.成员名成员名结构体指针名结构体指针名内嵌结构体变量名内嵌结构体变量名.成员名成员名(*(*结构体指针名结构体指针名).内嵌结构体变量名内嵌结构体变量名.成员名成员名第42页/共127页n n下面以结构体类型下面以结构体类型struct studentstruct student为例,说明访问结构为例,说明访问结构体成员的各种等价表示形式。若体成员的各种等价表示形式。若struct student/*struct student/*定义结构体定义结构体*/char number5,*name;char number5,*nam
44、e;char sex;char sex;struct date int year;int month;int day;birthday;struct date int year;int month;int day;birthday;float score;float score;char*speciality;char*speciality;char school31;char school31;struct student st1,st210,*p1=&st1,*p2=st2;struct student st1,st210,*p1=&st1,*p2=st2;n n则访问结构体成员(包括变量
45、、数组、指针和内嵌则访问结构体成员(包括变量、数组、指针和内嵌结构)的各种等价形式列于表结构)的各种等价形式列于表7-37-3。第43页/共127页表7-3 结构体成员访问形式示例访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员number第i个字符st1.numberip1numberi(*p1).numberist2j.numberi(st2+j)numberip2j.numberi(p2+j)numberi第44页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员number首地址st1.numberp1number(*p1).numbers
46、t2j.number(st2+j)numberp2j.number(p2+j)number第45页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员numberi地址&st1.numberi&p1numberi&(*p1).numberi&st2j.numberi&(st2+j)numberi&p2j.numberi&(p2+j)numberi第46页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员name的第i个字符st1.nameip1namei(*p1).nameist2j.namei(st2+j)nameip2j.namei(p
47、2+j)namei第47页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员name的首地址st1.namep1name(*p1).namest2j.name(st2+j)namep2j.name(p2+j)name第48页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员score的值st1.scorep1score(*p1).scorest2j.score(st2+j)scorep2j.score(p2+j)score成员score首地址&st1.score&p1score&(*p1).score&st2j.score&(st2+j)
48、score&p2j.score&(p2+j)score第49页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针成员birthday首地址&st1.birthday&p1birthday&(*p1).birthday&st2j.birthday&(st2+j)birthday&p2j.birthday&(p2+j)birthday第50页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针二级成员year的值st1.birthday.yearp1birthday.year(*p1).birthday.yearst2j.birthday.year(s
49、t2+j)birthday.yearp2j.birthday.year(p2+j)birthday.year第51页/共127页访问对象结构体变量st1及其指针结构体数组元素st2j及其指针二级成员year地址&st1.birthday.year&p1birthday.year&(*p1).birthday.year&st2j.birthday.year&p2j.birthday.year&(st2+j)birthday.year&(p2+j)birthday.year第52页/共127页7.7指向结构体类型数据的指针指向结构体类型数据的指针n n7.7.1结构体指针的初始化结构体指针的初始化
50、n n7.7.2结构体指针的应用结构体指针的应用第53页/共127页7.7.1结构体指针的初始化结构体指针的初始化n n可以通过用结构体变量的首地址或结构体数组的数组名作结构体可以通过用结构体变量的首地址或结构体数组的数组名作结构体类型指针的初值,从而使其指向对应的结构体变量或结构体数组。类型指针的初值,从而使其指向对应的结构体变量或结构体数组。第54页/共127页7.7.2结构体指针的应用结构体指针的应用n n1.指向结构体变量的指针指向结构体变量的指针n n2.指向结构体数组的指针指向结构体数组的指针第55页/共127页1.指向结构体变量的指针指向结构体变量的指针n n一个结构体变量的指针