1、第第9 9章章结构体与共用体结构体与共用体C语言程序设计C C语言程序设计结构体和共用体结构体和共用体第九章第九章 9.1 结构体的说明和定义结构体的说明和定义 9.2 结构体成员的引用与结构体变量的初始化结构体成员的引用与结构体变量的初始化 9.3 结构体数组结构体数组 9.4 结构体指针结构体指针 9.5 结构体在函数间的传递结构体在函数间的传递 9.6 结构体型和结构体指针型函数结构体型和结构体指针型函数 9.7 共用体简介共用体简介 9.8 枚举类型枚举类型 9.9 用用typedef定义类型定义类型第第9 9章章 结构体和共用体结构体和共用体 9.1.1 结构体的概念结构体的概念 9
2、.1.2 结构体的说明结构体的说明 9.1.3 结构体变量的定义结构体变量的定义9.1 结构体的说明和定义结构体的说明和定义9.1 结构体的说明和定义结构体的说明和定义 在程序的设计中在程序的设计中, 会遇见一些关系密切、具有内在联系而且数据类型会遇见一些关系密切、具有内在联系而且数据类型不同的数据。例如不同的数据。例如, 一个班、一个年级或全校学生的学籍卡包括:他们一个班、一个年级或全校学生的学籍卡包括:他们的学号、姓名、性别、年龄、学习成绩、地址的学号、姓名、性别、年龄、学习成绩、地址. .等。这些数据有的是等。这些数据有的是数字、有的是字符,其数据类型不同数字、有的是字符,其数据类型不同
3、, 对于这样一类数据可以用结构体对于这样一类数据可以用结构体来处理。来处理。9.1.1 结构体的概念结构体的概念结构体是不同数据类型的数据的集合。结构体是不同数据类型的数据的集合。结构体是构造类型的数据。结构体是构造类型的数据。NUM NAME SEX AGE SCORE ADDR 2010001 Li feng M 18 76 Beijing 2010002 Wang bing M 18 89 Beijing 2010030 Chen ming M 17 86 Beijing 一个结构体由若干成员组成。它是组成结构体的要素。一个结构体由若干成员组成。它是组成结构体的要素。每个成员的数据类型可
4、以不同,也可以相同。每个成每个成员的数据类型可以不同,也可以相同。每个成员有自己的名字。员有自己的名字。对结构体数据的操作是通过对结构体成员的引用实现对结构体数据的操作是通过对结构体成员的引用实现的。的。 结构体的应用为处理复杂的数据结构体提供了有利的手段。特别是结构体的应用为处理复杂的数据结构体提供了有利的手段。特别是对处理那些数据结构比较复杂的程序提供了方便。对处理那些数据结构比较复杂的程序提供了方便。每一个结构体有一个名字每一个结构体有一个名字, 所有成员都组织在该名字之下。所有成员都组织在该名字之下。 结构体名结构体名结构体成员名结构体成员名9.1.1 结构体的概念结构体的概念9.1.
5、2 结构体的说明结构体的说明 由于结构体是由不同数据类型的数据组成的集合体。它包含若干由于结构体是由不同数据类型的数据组成的集合体。它包含若干成员。因此成员。因此, 在使用结构体进行数据处理时在使用结构体进行数据处理时, 首先应对结构体的组成进首先应对结构体的组成进行描述。这种描述称为结构体说明。行描述。这种描述称为结构体说明。 结构体说明实质上是构造一个结构体。说明的是结构体是由哪结构体说明实质上是构造一个结构体。说明的是结构体是由哪些成员组成以及成员的数据类型。些成员组成以及成员的数据类型。结构体说明的格式:结构体说明的格式:struct (是保留字)结构体类型标识符。是保留字)结构体类型
6、标识符。结构体名结构体名(称结构体类型名)由标识符组成。(称结构体类型名)由标识符组成。大括号中的结构体成员表大括号中的结构体成员表, 称为结构体。称为结构体。结构体成员表包含若干成员。结构体成员表包含若干成员。struct 结构体名结构体名 结构体成员表结构体成员表; ; 成员的表达形式:成员的表达形式:数据类型标识符数据类型标识符 结构体成员名;结构体成员名;成员的数据类型成员的数据类型例:用结构建立学生的学籍卡(数据体)。例:用结构建立学生的学籍卡(数据体)。NUM NAME SEX AGE SCORE ADDR 2010001 Li feng M 18 76 Beijing 20100
7、02 Wang bing M 18 89 Beijing 2010030 Chen ming M 17 86 Beijing 20100012010002 2010030 Lifeng Wangbing Chenming M M M 18 18 17 87 79 92 Beijing Beijing Beijing struct student long num; char name20; char sex; int age; float score; char addr30;student1,student2, . . ; student1 student2 student30 结构体变量名
8、结构体变量名结构体成员名结构体成员名结构体名结构体名结构体类型标识符结构体类型标识符有关结构体说明应注意以下几点:有关结构体说明应注意以下几点:1) 结构体说明描述了结构体的组织形式结构体说明描述了结构体的组织形式, 在程序编译时并不在程序编译时并不为它分配为它分配存储空间存储空间。2) 结构体成员结构体成员可以是简单变量、数组、指针、结构体或联合可以是简单变量、数组、指针、结构体或联合体等。所以,结构体可以嵌套使用体等。所以,结构体可以嵌套使用, 即一个结构体变量也即一个结构体变量也可以成为另一个结构体的成员。可以成为另一个结构体的成员。3) 结构体说明可以在结构体说明可以在函数内部函数内部
9、, 也可以在也可以在函数外部函数外部。4) 若程序规模较大,可把其结构体说明部分作为文件存放起若程序规模较大,可把其结构体说明部分作为文件存放起来(该文件是以来(该文件是以.h为后缀的为后缀的“头文件头文件”),这样可借助于),这样可借助于“#include”预编辑语句把它复制到任何源文件中,用以预编辑语句把它复制到任何源文件中,用以定义同类型的其它结构体变量。定义同类型的其它结构体变量。5) 结构体成员名可以与程序中其它变量结构体成员名可以与程序中其它变量同名同名, 系统会自动识系统会自动识别它们别它们, 两者不会混淆。两者不会混淆。2010001 Li feng M 18 87 Beiji
10、ng Month Day birthday year student1struct date int month; int day; int year; ; 定义一个定义一个struct date结构体,它代表结构体,它代表日期包括三个成员,日期包括三个成员,month(月月)、day(日日)、year(年年)。结构体成员可以是另一结构体变量结构体成员可以是另一结构体变量struct student long num; char name20; char sex; int age; float score; char addr30; struct date birthday; ;在定义在定义s
11、truct student 结构体时,结构体时,成员成员birthday被定义被定义struct date类型。类型。即结构体成员为另一结构体变量。即结构体成员为另一结构体变量。已定义的(结构)类型已定义的(结构)类型struct date与其他类型与其他类型(int 、char)一样可以用来一样可以用来定义结构体成员的类型。定义结构体成员的类型。例例:成员成员name、addr是数组类型是数组类型9.1.3 结构体变量的定义结构体变量的定义 结构体变量同其它变量一样也必须先说明、定义结构体变量同其它变量一样也必须先说明、定义, 然然后才能引用。后才能引用。 结构体变量定义要按照结构体说明中的
12、结构体类型结构体变量定义要按照结构体说明中的结构体类型, 为被定义的结构体变量分配内存单元为被定义的结构体变量分配内存单元, 而结构体说明不分而结构体说明不分配内存。配内存。 对结构体中数据(结构体成员)的操作是通过结构体对结构体中数据(结构体成员)的操作是通过结构体变量的引用来实现的。用结构体变量可以对结构体成员进变量的引用来实现的。用结构体变量可以对结构体成员进行赋值、存取或运算。行赋值、存取或运算。1、结构体变量的作用、结构体变量的作用2、结构体变量定义的意义、结构体变量定义的意义例如:例如: struct student int num; char name20; char sex;
13、int age; float score; char addr30;student1,student2,student3;(1) 在结构体说明的同时定义结构体变量在结构体说明的同时定义结构体变量该例结构体名为该例结构体名为student,用它定义了三个结构用它定义了三个结构体变量体变量student1、student2、student3,三个变三个变量具有相同的组成结构体,即相同的类型。量具有相同的组成结构体,即相同的类型。 这种定义方法的特点是:定义一次结构体变量之后,在该定义之后的这种定义方法的特点是:定义一次结构体变量之后,在该定义之后的任何位置还可用该结构体类型来定义其它结构体变量。任
14、何位置还可用该结构体类型来定义其它结构体变量。3、结构体变量定义格式、结构体变量定义格式结构体变量定义的三种形式:结构体变量定义的三种形式:struct 结构体名结构体名 结构体成员表;结构体成员表; 结构体变量名表;结构体变量名表;其定义格式为:其定义格式为:例如:例如:struct int num; char name20; char sex; int age; float score; char addr30;student1,student2,student3; 不出现结构体名不出现结构体名这里定义了三个结构体变量与这里定义了三个结构体变量与(1)相同。相同。这种定义方法的特点是:这种
15、定义方法的特点是:struct 结构体成员表;结构体成员表; 结构体变量名表;结构体变量名表;(2) 直接定义结构体变量直接定义结构体变量其定义形式为:其定义形式为:不出现结构体名不出现结构体名这种定义方法的特点是:不能在别处用来另行定义别的结构体变量,要这种定义方法的特点是:不能在别处用来另行定义别的结构体变量,要想定义就必须将想定义就必须将struct 这部分重写。这部分重写。例如:例如:struct student int num; char name20; char sex; int age; float score; char addr30; . . .struct student
16、student1,student2,student3; 这种定义方法的特点是:这种定义方法的特点是:可把其结构体说明部分作为文件存放起来,可把其结构体说明部分作为文件存放起来,这样可借助于这样可借助于“#include”预编辑语句把它复预编辑语句把它复制到任何源文件中,用以定义同类型的其它制到任何源文件中,用以定义同类型的其它结构体变量。结构体变量。 struct 结构体名结构体名 结构体成员表;结构体成员表; ; . . .存贮类型 struct 结构体名结构体名 结构体变量名表;结构体变量名表;(3) 把定义和说明分开把定义和说明分开其定义格式为:其定义格式为:1)注意结构体声明和结构体变
17、量定义的注意结构体声明和结构体变量定义的区别区别。2)每个结构体变量表示的是每个结构体变量表示的是一组一组(域域)成员成员(数据数据)。而不是一个。而不是一个数据。数据。3)每个结构体中所有结构体变量的每个结构体中所有结构体变量的结构结构(类型类型)是一样的。是一样的。4)在一个结构体中可以定义多少个结构体成员。在一个结构体中可以定义多少个结构体成员。5)结构体变量的定义一定要在结构体变量的定义一定要在结构体说明结构体说明之后或与结构体说之后或与结构体说明同时进行。明同时进行。6)结构体变量一般不用结构体变量一般不用register寄存器型寄存器型的存储方式。的存储方式。7)结构体变量中的成员
18、可以结构体变量中的成员可以单独单独使用,其作用和地位与一般使用,其作用和地位与一般变量相同。变量相同。8)结构体变量结构体变量占用实际内存的大小占用实际内存的大小可用可用sizeof( )运算来实现。运算来实现。即:即:sizeof(结构体名)。(结构体名)。结构体变量的定义应注意的几点:结构体变量的定义应注意的几点:9.2 结构体成员的引用与结构体变量的初始化结构体成员的引用与结构体变量的初始化 9.2.1 结构体成员的引用结构体成员的引用 9.2.2 结构体变量的初始化结构体变量的初始化9.2 结构体成员的引用与结构体变量的初始化结构体成员的引用与结构体变量的初始化结构体成员引用有三种方式
19、:结构体成员引用有三种方式:9.2.1 结构体成员的引用结构体成员的引用(2) 用指针的方式用指针的方式(1) 用结构体成员运算符方式用结构体成员运算符方式 定义一个指针结定义一个指针结(构体指针构体指针), 使它指向该结构体变量使它指向该结构体变量, 这时就可用指这时就可用指针和成员名来引用结构体成员了。针和成员名来引用结构体成员了。即:结构体变量名即:结构体变量名. 成员名成员名 。(3) 用用“-”指向运算符引用结构体成员指向运算符引用结构体成员 定义一个指针定义一个指针(结构体指针结构体指针), 使它指向该结构体变量使它指向该结构体变量, 这时就可用指这时就可用指针和成员名来引用结构体
20、成员了。其格式为:指针名针和成员名来引用结构体成员了。其格式为:指针名-结构体成员名结构体成员名 例:例:struct student long num; char name20; char sex; int age; float score; char addr30; stu1,stu2;结构体成员的引用:结构体成员的引用:用结构成员运算符用结构成员运算符“.”引用结构体成员引用结构体成员struct student stu1;struct student stu2;stu1.num=2010001;stu1.sex=M;stu1.age=18;stu1.score=87;Strcpy(st
21、u1.addr,“Beijing”);用结构成员运算符用结构成员运算符“.”引用结构体成员格式引用结构体成员格式:“.” 结构体成员运算符结构体成员运算符结构体成员运算符就表示对结构体成员的引用结构体成员运算符就表示对结构体成员的引用结构体变量名结构体变量名 . 结构体成员结构体成员(2) 不能将一个结构体变量作为一个整体加以引用。不能将一个结构体变量作为一个整体加以引用。(3) 对结构体成员的操作与其它变量一样,可进行各种运算。对结构体成员的操作与其它变量一样,可进行各种运算。结构体成员引用的几点说明:结构体成员引用的几点说明:例:例:stu1.num 作为一个整体来看待,并对其操作。作为一
22、个整体来看待,并对其操作。 *stu1.num “.”优先于优先于“*”,其等效为,其等效为 *(stu1.num)。其含义为访问其含义为访问stu1.num(所指地址中的内容)的目标变量。所指地址中的内容)的目标变量。赋值运算:赋值运算: stu1.score=stu2.score;算术运算:算术运算: sum=(stu1.score+stu2.score)/2;自加减运算:自加减运算:stu1.age+; +stu1.age;关系运算:关系运算: stu1.age=stu2.age;例:例:printf(“%d,%s,%c,%d,%f,%s”,stu1); (1) 结构体成员运算符结构体成
23、员运算符“.”的优先级最高,结合性为左结合(从左至右)。的优先级最高,结合性为左结合(从左至右)。用结构体成员运算符用结构体成员运算符9.2.2 结构体变量的初始化结构体变量的初始化结构体变量初始化的格式:结构体变量初始化的格式:对结构体变量初始化应注意几点:对结构体变量初始化应注意几点:(1)只能对存储类型为只能对存储类型为extern外部型和外部型和static静态型结构体变量初始化,静态型结构体变量初始化,不能对存储类型为不能对存储类型为auto自动型的结构体变量初始化。自动型的结构体变量初始化。(2)初始化数据与数据之间用逗号隔开。初始化数据与数据之间用逗号隔开。(3)初始化数据的个数
24、要与被赋值的结构体成员的个数相等。初始化数据的个数要与被赋值的结构体成员的个数相等。(4)初始化数据的类型要与相应的结构体成员的数据类型一致。初始化数据的类型要与相应的结构体成员的数据类型一致。(5)不能直接在结构体成员表中对成员赋初值。不能直接在结构体成员表中对成员赋初值。 结构体变量的初始化,就是在定义结构体变量的同时,对其成员赋结构体变量的初始化,就是在定义结构体变量的同时,对其成员赋初值。规定,只准许对外部和静态结构体变量进行初始化,不能对自初值。规定,只准许对外部和静态结构体变量进行初始化,不能对自动类型的结构体变量初始化。动类型的结构体变量初始化。struct 结构体名结构体名 结
25、构体变量名结构体变量名= 初始数据初始数据 ;例:例:struct student long num; char name20; char sex; int age; float score; char addr30;struct student stu1=2010001, “Li feng”, M, 18, 87.0, “Beijing”; struct student long num=2010001; char name20=“Li feng”; char sex=M; int age=18; float score=87.0; char addr30=“Beijing”; stu1,s
26、tu2;不能直接在结构体成员表中对成员赋初值不能直接在结构体成员表中对成员赋初值例例9-1 用用scanf函数将结构体变量数据输入,用函数将结构体变量数据输入,用printf函数将其输出。函数将其输出。main( ) struct student long num; char name20; char sex; float score; char addr30; ; struct student stu1; scanf(%c,&stu1.sex); scanf(%ld,&stu1.num); scanf(%s,stu1.name); scanf(%f,&stu1.score); scanf(%
27、s,stu1.addr); printf(nnum:%ldn,stu1.num); printf(name:%sn,stu1.name); printf(sex:%cn,stu1.sex); printf(score:%.2fn,stu1.score); printf(addr:%sn,stu1.addr);运行程序运行程序M2010001Li feng87Beijingnum:2010001name:Li fengsex:Mscore:87addr:Beijing例例 main( ) struct date int day; int month; int year; char mon_nam
28、e10; ; struct date a=28,7,1997,July; printf(day:%dn,a.day); printf(month:%dn,a.month); printf(year:%dn,a.year); printf(mon_name:%sn,a.mon_name); 运行程序运行程序day:28month:7year:1997mon_name:July9.3 结构体数组结构体数组 9.3.1 结构体数组的概念结构体数组的概念 9.3.2 结构体数组的定义结构体数组的定义 9.3.3 结构体数组的初始化结构体数组的初始化 9.3.4 结构体数组的应用举例结构体数组的应用举例
29、9.3 结构体数组结构体数组stu1 stu2 stu3020100011 2010002 2010030 Lifeng Wangbing Chenming M M M 18 18 17 87 79 92 Beijing Beijing Beijing struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2,stu29; 例如例如: 一个班级学生的学籍卡的数据结构如下一个班级学生的学籍卡的数据结构如下, 要使用该结构体中每个学要使用该结构体中每个学生的数据生的数据,
30、就要定义就要定义30个结构体变量个结构体变量(名名), 即即:stu1, stu2. stu30。这种方法这种方法很不方便。由于该例结构体变量名都相同很不方便。由于该例结构体变量名都相同, 就是最后的序号不同就是最后的序号不同, 这种情况这种情况可使用结构体数组。可使用结构体数组。 结构体数组是其数组元素都是具有相同结构体类型的结构体变量。即结构体数组是其数组元素都是具有相同结构体类型的结构体变量。即结构体数组是结构体变量集合的一种数组。结构体数组是结构体变量集合的一种数组。 结构体数组元素中可存放哪些具有内在联系、相互关联的结构体变量。结构体数组元素中可存放哪些具有内在联系、相互关联的结构体
31、变量。结构体数组适合处理一组具有相同结构体类型的数据。结构体数组适合处理一组具有相同结构体类型的数据。9.3.1 结构体数组的概念结构体数组的概念stu30;9.3.2 结构体数组的定义结构体数组的定义例如例如: static struct student stu30; 例中例中定义了定义了30个结构体变量,下标个结构体变量,下标0-29(下标从(下标从0开始),开始),结构体变量是结构体变量是 stu0、stu1、stu2、. .stu29。 结构体数组也必须先定义或说明,后引用。结构体数组也必须先定义或说明,后引用。结构体数组定义的格式:结构体数组定义的格式:存储类型存储类型 struct
32、 结构体名结构体名 结构体数组名结构体数组名 元素个数元素个数, 结构体名结构体名元素个数元素个数, . . .; 结构体数组定义的说明:结构体数组定义的说明:1)在结构体数组定义中,结构体即在结构体数组定义中,结构体即: “struct 结构体名结构体名”是已被说明的结构是已被说明的结构体类型。先说明后定义。体类型。先说明后定义。2)存储类型是结构体数组(即结构体变量)的存储类型。存储类型是结构体数组(即结构体变量)的存储类型。3)结构体数组与前面介绍的数值型数组不同之处在于每个数组元素都是一结构体数组与前面介绍的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们分别包含各个成
33、员项(一组数据)。个结构体类型的数据,它们分别包含各个成员项(一组数据)。 9.3.3 结构体数组的初始化结构体数组的初始化 结构体数组的初始化,就是在定义结构体数组的同时,对其成员赋结构体数组的初始化,就是在定义结构体数组的同时,对其成员赋初值。初值。结构体数组的初始化格式为:结构体数组的初始化格式为:存储类型存储类型 struct 结构体名结构体名 结构体数组名结构体数组名 元素个数元素个数= 初始化数据初始化数据 ;说明:说明:1)结构体即结构体即“struct 结构体名结构体名”是已被说明的结构体类型。是已被说明的结构体类型。2)初始化的数据的个数与结构体数组元素的个数相同,数据类型相
34、匹配。初始化的数据的个数与结构体数组元素的个数相同,数据类型相匹配。3)为了提高可读性,最好每一个数组元素为了提高可读性,最好每一个数组元素(结构体变量结构体变量)的初始数据都用花的初始数据都用花括号括起来。括号括起来。4)初始化结构体成员数据之间、数组元素之间用逗号隔开。初始化结构体成员数据之间、数组元素之间用逗号隔开。存储类型存储类型 struct 结构体名结构体名 结构体成员表结构体成员表; 结构体数组名结构体数组名 元素个数元素个数= 初始化数据初始化数据 ;或或例:例:struct student long num; char name20; char sex; int age; f
35、loat score; char addr30;stu30= 2010001,“Li feng”,M,18,87,“Beijing”, 2010002,“Wang bing”,M,18,79,“Beijing”, . . . . 2010030,“Chen ming” ,M,17,80,“Beijing” ;例中给结构体变量例中给结构体变量stu0、 stu1、. . Stu29的各个成员赋初值。的各个成员赋初值。struct student int num; char name20; char sex; int age; float score; char addr30;struct stu
36、dent stu30= 2010001,“Li feng”, M,18, 87,“Beijing”, 2010002,“Wang bing”, M,18,79,“Beijing”, . . . . 2010030,“Chen ming”, M,17, 80,“Beijing” ;结构体数组的初始化也可用以下的形式:结构体数组的初始化也可用以下的形式:例例9.2下述程序的输出结果是:下述程序的输出结果是:main( )struct copml int x; int y; coum2=1,3,2,7; printf(“%d”,coum0.y/coum0.x*coum1.x); A) 0 B) 1
37、C) 3 D) 6答案:答案: D3129.4 结构体指针结构体指针 9.4.1 结构体指针的概念结构体指针的概念 9.4.2 结构体指针的定义和引用结构体指针的定义和引用 9.4.3 通过结构体指针引用结构体成员通过结构体指针引用结构体成员 9.4.4 结构体指针的应用结构体指针的应用9.4 结构体指针结构体指针 结构体指针是指向结构体变量的指针。结构体指针是指向结构体变量的指针。 结构体指针是一个指针变量结构体指针是一个指针变量, 用来指向结构体变量;其目标变量是一用来指向结构体变量;其目标变量是一个结构体变量个结构体变量, 其目标是一个结构体变量的其目标是一个结构体变量的(一组一组) 数
38、据数据, 其内容是结构体其内容是结构体变量的变量的(首首)地址。地址。结构体指针定义的格式:结构体指针定义的格式:9.4.1 结构体指针的概念结构体指针的概念9.4.2 结构体指针变量的定义和引用结构体指针变量的定义和引用存储类型存储类型 struct 结构体名结构体名 *结构体指针名;结构体指针名;例如:例如: static struct student *pstu;struct student 是预先说明的结构体。是预先说明的结构体。*pstu 结构体指针的存储类型是结构体指针的存储类型是static。(1)结构体名必须是已经说明的结构体。结构体名必须是已经说明的结构体。struct st
39、udent int num; char name20; char sex; int age; float score; char addr30; stu1,stu2,. stu30 ;static struct student *pstu;pstu=&stu1;(2)结构体指针变量在使用前必须要进行赋值操作,以把某个结构体变结构体指针变量在使用前必须要进行赋值操作,以把某个结构体变量的地址赋给结构体指针,使它指向该结构体变量。量的地址赋给结构体指针,使它指向该结构体变量。struct student int num; char name20; char sex; int age; float
40、score; char addr30; stu30 ;static struct student *pstu;pstu=&stu0;结构体数组结构体数组结构体指针变量的定义和引用应注意的问题:结构体指针变量的定义和引用应注意的问题:(3)结构体指针所指向的结构体变量必须与定义时所规定的结构体类型一致。结构体指针所指向的结构体变量必须与定义时所规定的结构体类型一致。struct student1 int num; char name20; char sex; int age; float score; char addr30; stu130 ;static struct student1 *ps
41、tu1;pstu1=stu2;struct student2 int num; char name20; char sex; int age; char addr30; stu230 ;static struct student2 *pstu2;pstu2=stu1; 上例中的两个结构体的结构类型(结构体成员)不同。上例中的两个结构体的结构类型(结构体成员)不同。结构体指针结构体指针* pstu1 和和*pstu2不能指向对方的结构体变量。不能指向对方的结构体变量。 (4)结构体指针的运算原则同一般指针一样。结构体指针的运算原则同一般指针一样。例如:结构体指针的加例如:结构体指针的加1或减或减
42、1运算(加、减整型常量),其含义是运算(加、减整型常量),其含义是将指针指向下一个或上一个结构体变量。将指针指向下一个或上一个结构体变量。9.4.3 通过结构体指针引用结构体成员通过结构体指针引用结构体成员例如例如:struct student int num; char name20; char sex; int age; float score; char addr30;stu30;struct student *pstu; pstu=stu;以下引用是正确的以下引用是正确的 stu0.numstu0.name(*(pstu+2).num (*pstu).name (Pstu+2) -se
43、xpstu -age在定义结构体指针以后,就可以用结构体指针引用结构体成员。在定义结构体指针以后,就可以用结构体指针引用结构体成员。引用的方法如下:引用的方法如下:(*结构体指针名)结构体指针名). 成员名成员名结构体指针名结构体指针名 - 成员名成员名或或例如例如:struct data int x; int y;a;struct data *p;p=&a; 用结构体变量名用结构体变量名 . 结构体成员名引用结构体成员名引用 a.x a.y用(用(*结构体指针名)结构体指针名). 结构体成员名引用结构体成员名引用 (*p).x (*p).y 用结构体指针名用结构体指针名 - 结构体成员名引用
44、结构体成员名引用 p-x p-y结构体变量名结构体变量名 . 结构体成员名结构体成员名结构体成员引用的三种形式结构体成员引用的三种形式:(*结构体指针名)结构体指针名). 结构体成员名结构体成员名结构体指针名结构体指针名 - 结构体成员名结构体成员名例如例如: struct data int x; int *y; a10; struct data *p; p=a; 引用结构体成员引用结构体成员x。等效为等效为*(p.y) p.y 是一个指针,是一个指针,*p.y 是取该指针的目标。是取该指针的目标。意义同上。意义同上。等效为等效为+(p -x) 结构体成员结构体成员x加加1。 引用结构体成员引
45、用结构体成员 x 之前结构体指针之前结构体指针 p 加加1。即。即a1的成员的成员x先先引用结构体成员引用结构体成员 x ,然后结构体指针然后结构体指针 p 加加1。 引用引用 x 内容后,内容后,x 加加1。先先引用结构体成员引用结构体成员 y 所指向的内容后,然后其值加所指向的内容后,然后其值加1。在应用结构体成员的引用及计算时应注意它们使用的区别在应用结构体成员的引用及计算时应注意它们使用的区别C语言计算中运算符语言计算中运算符“ .” 、“ -”、“ ( )” 、“ ”的优先级最高。的优先级最高。(*p).x*p.y*p-x+p-x(+p)-x(p+)-xp-x+(*p-y)+例例9-
46、4 指向结构体变量指针的应用。指向结构体变量指针的应用。 #include#includemain( ) struct student int stuno; char name20; float score; ; struct student stu,*p; p=&stu; p-stuno=9701; strcpy(*p).name,“Li ping”); stu.score=95.5; printf(”n1 Student No. %dn Name: %s n Score: %fn, p-stuno,p-name,p-score); printf(n2 Student No.: %d Nam
47、e: %s Score: %fn, (*p).stuno,(*p).name,(*p).score);定义结构体定义结构体定义结构体成员定义结构体成员定义结构体变量和结构体指针变量定义结构体变量和结构体指针变量给结构体成员赋值给结构体成员赋值给结构体指针赋值给结构体指针赋值输出结构体数据输出结构体数据运行程序运行程序1 Student No: 9701 Name : Liping Score: 95.5000002 Student No: 9701 Name: Liping Score: 95.500000 例例9-5 指向结构体数组指针的应用。指向结构体数组指针的应用。struct stud
48、ent int stuno; char name20; int score; struct student st3=20001,Li ping,95, 20002,Zhang hua,93, 20003,Sun hong,98;main( ) struct student *p; printf(“Student No. Name Socre n); for(p=st;pstuno,p-name,p-score);定义、初始化结构体数组定义、初始化结构体数组定义结构体指针定义结构体指针输出结构体中的数据输出结构体中的数据运行程序运行程序Student No. Name Score 20001 L
49、iping 95 20002 Zhanghua 93 20003 Sunhong 98 9.5.1 结构体变量的传递结构体变量的传递 9.5.2 结构体数组在函数间的传递结构体数组在函数间的传递9.5 结构体在函数间的传递结构体在函数间的传递9.5 结构体在函数间的传递结构体在函数间的传递 函数间不仅可以传递简单变量、数组、指针等类型的变量,而且还函数间不仅可以传递简单变量、数组、指针等类型的变量,而且还可以传递结构体类型的变量。函数之间结构体变量的传递同一般变量可以传递结构体类型的变量。函数之间结构体变量的传递同一般变量一样,可以用数据复制方式传递,也可以用地址复制方式传递。一样,可以用数据
50、复制方式传递,也可以用地址复制方式传递。9.5.1 结构体变量的传递结构体变量的传递 用复制方式传递结构体变量时用复制方式传递结构体变量时,可以把结构体变量作为普通变量来处可以把结构体变量作为普通变量来处理。例如两个类型相同的结构体变量之间可以进行赋值,可以把一个理。例如两个类型相同的结构体变量之间可以进行赋值,可以把一个结构体变量作为一个参数以复制方式传递给被调用函数,函数也可以结构体变量作为一个参数以复制方式传递给被调用函数,函数也可以返回一个结构体变量类型的值等。返回一个结构体变量类型的值等。1、用数据复制方式传递结构体变量(传值方式)、用数据复制方式传递结构体变量(传值方式)struc