第9章结构体共用体.ppt
,第9章结构体与共用体,C语言程序设计,C语言程序设计,结构体和共用体,第九章,9.1 结构体的说明和定义 9.2 结构体成员的引用与结构体变量的初始化 9.3 结构体数组 9.4 结构体指针 9.5 结构体在函数间的传递 9.6 结构体型和结构体指针型函数 9.7 共用体简介 9.8 枚举类型 9.9 用typedef定义类型,第9章 结构体和共用体,9.1.1 结构体的概念 9.1.2 结构体的说明 9.1.3 结构体变量的定义,9.1 结构体的说明和定义,9.1 结构体的说明和定义,在程序的设计中,会遇见一些关系密切、具有内在联系而且数据类型不同的数据。例如,一个班、一个年级或全校学生的学籍卡包括:他们的学号、姓名、性别、年龄、学习成绩、地址.等。这些数据有的是数字、有的是字符,其数据类型不同,对于这样一类数据可以用结构体来处理。,9.1.1 结构体的概念,结构体是不同数据类型的数据的集合。结构体是构造类型的数据。,一个结构体由若干成员组成。它是组成结构体的要素。每个成员的数据类型可以不同,也可以相同。每个成员有自己的名字。对结构体数据的操作是通过对结构体成员的引用实现的。,结构体的应用为处理复杂的数据结构体提供了有利的手段。特别是对处理那些数据结构比较复杂的程序提供了方便。,每一个结构体有一个名字,所有成员都组织在该名字之下。,结构体名,结构体成员名,9.1.1 结构体的概念,9.1.2 结构体的说明,由于结构体是由不同数据类型的数据组成的集合体。它包含若干成员。因此,在使用结构体进行数据处理时,首先应对结构体的组成进行描述。这种描述称为结构体说明。,结构体说明实质上是构造一个结构体。说明的是结构体是由哪些成员组成以及成员的数据类型。,结构体说明的格式:,struct(是保留字)结构体类型标识符。结构体名(称结构体类型名)由标识符组成。大括号中的结构体成员表,称为结构体。结构体成员表包含若干成员。,struct 结构体名 结构体成员表;,成员的表达形式:,数据类型标识符 结构体成员名;,成员的数据类型,例:用结构建立学生的学籍卡(数据体)。,struct student long num;char name20;char sex;int age;float score;char addr30;student1,student2,.;,student1 student2 student30,结构体变量名,结构体成员名,结构体名,结构体类型标识符,有关结构体说明应注意以下几点:,结构体说明描述了结构体的组织形式,在程序编译时并不为它分配存储空间。结构体成员可以是简单变量、数组、指针、结构体或联合体等。所以,结构体可以嵌套使用,即一个结构体变量也可以成为另一个结构体的成员。结构体说明可以在函数内部,也可以在函数外部。若程序规模较大,可把其结构体说明部分作为文件存放起来(该文件是以.h为后缀的“头文件”),这样可借助于“#include”预编辑语句把它复制到任何源文件中,用以定义同类型的其它结构体变量。结构体成员名可以与程序中其它变量同名,系统会自动识别它们,两者不会混淆。,student1,struct 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;,在定义struct student 结构体时,成员birthday被定义struct date类型。即结构体成员为另一结构体变量。已定义的(结构)类型struct date与其他类型(int、char)一样可以用来定义结构体成员的类型。,例:,成员name、addr是数组类型,9.1.3 结构体变量的定义,结构体变量同其它变量一样也必须先说明、定义,然后才能引用。结构体变量定义要按照结构体说明中的结构体类型,为被定义的结构体变量分配内存单元,而结构体说明不分配内存。,对结构体中数据(结构体成员)的操作是通过结构体变量的引用来实现的。用结构体变量可以对结构体成员进行赋值、存取或运算。,1、结构体变量的作用,2、结构体变量定义的意义,例如:struct student int num;char name20;char sex;int age;float score;char addr30;student1,student2,student3;,(1)在结构体说明的同时定义结构体变量,该例结构体名为student,用它定义了三个结构体变量student1、student2、student3,三个变量具有相同的组成结构体,即相同的类型。,这种定义方法的特点是:定义一次结构体变量之后,在该定义之后的任何位置还可用该结构体类型来定义其它结构体变量。,3、结构体变量定义格式,结构体变量定义的三种形式:,struct 结构体名 结构体成员表;结构体变量名表;,其定义格式为:,例如:struct int num;char name20;char sex;int age;float score;char addr30;student1,student2,student3;,不出现结构体名,这里定义了三个结构体变量与(1)相同。这种定义方法的特点是:,struct 结构体成员表;结构体变量名表;,(2)直接定义结构体变量,其定义形式为:,不出现结构体名,这种定义方法的特点是:不能在别处用来另行定义别的结构体变量,要想定义就必须将struct 这部分重写。,例如:struct student int num;char name20;char sex;int age;float score;char addr30;.struct student student1,student2,student3;,这种定义方法的特点是:可把其结构体说明部分作为文件存放起来,这样可借助于“#include”预编辑语句把它复制到任何源文件中,用以定义同类型的其它结构体变量。,struct 结构体名 结构体成员表;.存贮类型 struct 结构体名 结构体变量名表;,(3)把定义和说明分开,其定义格式为:,注意结构体声明和结构体变量定义的区别。每个结构体变量表示的是一组(域)成员(数据)。而不是一个数据。每个结构体中所有结构体变量的结构(类型)是一样的。在一个结构体中可以定义多少个结构体成员。结构体变量的定义一定要在结构体说明之后或与结构体说明同时进行。结构体变量一般不用register寄存器型的存储方式。结构体变量中的成员可以单独使用,其作用和地位与一般变量相同。结构体变量占用实际内存的大小可用sizeof()运算来实现。即:sizeof(结构体名)。,结构体变量的定义应注意的几点:,9.2 结构体成员的引用与结构体变量的初始化,9.2.1 结构体成员的引用 9.2.2 结构体变量的初始化,9.2 结构体成员的引用与结构体变量的初始化,结构体成员引用有三种方式:,9.2.1 结构体成员的引用,(2)用指针的方式,(1)用结构体成员运算符方式,定义一个指针结(构体指针),使它指向该结构体变量,这时就可用指针和成员名来引用结构体成员了。,即:结构体变量名.成员名。,(3)用“-”指向运算符引用结构体成员,定义一个指针(结构体指针),使它指向该结构体变量,这时就可用指针和成员名来引用结构体成员了。其格式为:指针名-结构体成员名,例: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(stu1.addr,“Beijing”);,用结构成员运算符“.”引用结构体成员格式:,“.”结构体成员运算符,结构体成员运算符就表示对结构体成员的引用,结构体变量名.结构体成员,(2)不能将一个结构体变量作为一个整体加以引用。,(3)对结构体成员的操作与其它变量一样,可进行各种运算。,结构体成员引用的几点说明:,例:stu1.num 作为一个整体来看待,并对其操作。*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)结构体成员运算符“.”的优先级最高,结合性为左结合(从左至右)。,用结构体成员运算符,9.2.2 结构体变量的初始化,结构体变量初始化的格式:,对结构体变量初始化应注意几点:,(1)只能对存储类型为extern外部型和static静态型结构体变量初始化,不能对存储类型为auto自动型的结构体变量初始化。,(2)初始化数据与数据之间用逗号隔开。,(3)初始化数据的个数要与被赋值的结构体成员的个数相等。,(4)初始化数据的类型要与相应的结构体成员的数据类型一致。,(5)不能直接在结构体成员表中对成员赋初值。,结构体变量的初始化,就是在定义结构体变量的同时,对其成员赋初值。规定,只准许对外部和静态结构体变量进行初始化,不能对自动类型的结构体变量初始化。,struct 结构体名 结构体变量名=初始数据;,例: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,stu2;,不能直接在结构体成员表中对成员赋初值,例9-1 用scanf函数将结构体变量数据输入,用printf函数将其输出。,main()struct student long num;char name20;char sex;float score;char addr30;struct student stu1;scanf(%c,运行程序,M2010001Li feng87Beijingnum:2010001name:Li fengsex:Mscore:87addr:Beijing,例,main()struct date int day;int month;int year;char mon_name10;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:July,9.3 结构体数组,9.3.1 结构体数组的概念 9.3.2 结构体数组的定义 9.3.3 结构体数组的初始化 9.3.4 结构体数组的应用举例,9.3 结构体数组,stu1 stu2 stu30,struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2,stu29;,例如:一个班级学生的学籍卡的数据结构如下,要使用该结构体中每个学生的数据,就要定义30个结构体变量(名),即:stu1,stu2.stu30。这种方法很不方便。由于该例结构体变量名都相同,就是最后的序号不同,这种情况可使用结构体数组。,结构体数组是其数组元素都是具有相同结构体类型的结构体变量。即结构体数组是结构体变量集合的一种数组。结构体数组元素中可存放哪些具有内在联系、相互关联的结构体变量。结构体数组适合处理一组具有相同结构体类型的数据。,9.3.1 结构体数组的概念,stu30;,9.3.2 结构体数组的定义,例如:static struct student stu30;例中定义了30个结构体变量,下标0-29(下标从0开始),结构体变量是 stu0、stu1、stu2、.stu29。,结构体数组也必须先定义或说明,后引用。,结构体数组定义的格式:,存储类型 struct 结构体名 结构体数组名 元素个数,结构体名元素个数,.;,结构体数组定义的说明:在结构体数组定义中,结构体即:“struct 结构体名”是已被说明的结构体类型。先说明后定义。存储类型是结构体数组(即结构体变量)的存储类型。结构体数组与前面介绍的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们分别包含各个成员项(一组数据)。,9.3.3 结构体数组的初始化,结构体数组的初始化,就是在定义结构体数组的同时,对其成员赋初值。,结构体数组的初始化格式为:,存储类型 struct 结构体名 结构体数组名 元素个数=初始化数据;,说明:,结构体即“struct 结构体名”是已被说明的结构体类型。初始化的数据的个数与结构体数组元素的个数相同,数据类型相匹配。为了提高可读性,最好每一个数组元素(结构体变量)的初始数据都用花括号括起来。初始化结构体成员数据之间、数组元素之间用逗号隔开。,存储类型 struct 结构体名 结构体成员表;结构体数组名 元素个数=初始化数据;,或,例:struct student long num;char name20;char sex;int age;float 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 student 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 C)3 D)6,答案:D,3,1,2,9.4 结构体指针,9.4.1 结构体指针的概念 9.4.2 结构体指针的定义和引用 9.4.3 通过结构体指针引用结构体成员 9.4.4 结构体指针的应用,9.4 结构体指针,结构体指针是指向结构体变量的指针。结构体指针是一个指针变量,用来指向结构体变量;其目标变量是一个结构体变量,其目标是一个结构体变量的(一组)数据,其内容是结构体变量的(首)地址。,结构体指针定义的格式:,9.4.1 结构体指针的概念,9.4.2 结构体指针变量的定义和引用,存储类型 struct 结构体名*结构体指针名;,例如:static struct student*pstu;struct student 是预先说明的结构体。*pstu 结构体指针的存储类型是static。,(1)结构体名必须是已经说明的结构体。,struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2,.stu30;static struct student*pstu;pstu=,(2)结构体指针变量在使用前必须要进行赋值操作,以把某个结构体变量的地址赋给结构体指针,使它指向该结构体变量。,struct student int num;char name20;char sex;int age;float score;char addr30;stu30;static struct student*pstu;pstu=,结构体数组,结构体指针变量的定义和引用应注意的问题:,(3)结构体指针所指向的结构体变量必须与定义时所规定的结构体类型一致。,struct student1 int num;char name20;char sex;int age;float score;char addr30;stu130;static struct student1*pstu1;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或减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)-sexpstu-age,在定义结构体指针以后,就可以用结构体指针引用结构体成员。引用的方法如下:,(*结构体指针名).成员名,结构体指针名-成员名,或,例如:struct data int x;int y;a;struct data*p;p=,用结构体变量名.结构体成员名引用 a.x a.y,用(*结构体指针名).结构体成员名引用(*p).x(*p).y,用结构体指针名-结构体成员名引用 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。引用结构体成员 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-4 指向结构体变量指针的应用。,#include#includemain()struct student int stuno;char name20;float score;struct student stu,*p;p=,定义结构体,定义结构体成员,定义结构体变量和结构体指针变量,给结构体成员赋值,给结构体指针赋值,输出结构体数据,运行程序,1 Student No:9701 Name:Liping Score:95.5000002 Student No:9701 Name:Liping Score:95.500000,例9-5 指向结构体数组指针的应用。,struct student 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 Liping 95 20002 Zhanghua 93 20003 Sunhong 98,9.5.1 结构体变量的传递 9.5.2 结构体数组在函数间的传递,9.5 结构体在函数间的传递,9.5 结构体在函数间的传递,函数间不仅可以传递简单变量、数组、指针等类型的变量,而且还可以传递结构体类型的变量。函数之间结构体变量的传递同一般变量一样,可以用数据复制方式传递,也可以用地址复制方式传递。,9.5.1 结构体变量的传递,用复制方式传递结构体变量时,可以把结构体变量作为普通变量来处理。例如两个类型相同的结构体变量之间可以进行赋值,可以把一个结构体变量作为一个参数以复制方式传递给被调用函数,函数也可以返回一个结构体变量类型的值等。,1、用数据复制方式传递结构体变量(传值方式),struct emp char name20;float salary;float comm;float sum;main()struct emp teacher;printf(nEnter name:);scanf(%s,teacher.name);teacher.salary=315.10;m=350.60;teacher.sum=teacher.salary+m;printf(n%s%.2f,teacher.name,teacher.salary);printf(%.2f%.2f,m,teacher.sum);printf(n Call-Function Display);display(teacher);printf(n After Call-Function);printf(n%s%.2f,teacher.name,teacher.salary);printf(%.2f%.2f,m,teacher.sum);,例9-6 用数据复制方式传递结构体变量。,定义结构体变量teacher,调用函数display调用时把结构体变量teacher作为实参传递给被调用函数的形参p。实参、形参具有相同的结构体类型。,display(p)struct emp p;printf(n%s%.2f%.2f%.2f,p.name,p.salary,m,p.sum);p.salay=519.50;m=410.50;p.sum=p.salay+m;printf(n%s%.2f%.2f%.2f,p.name,p.salary,m,p.sum);,程序运行,Enter Name;zhang ping zhang ping 315.10 350.60 665.70 Call-Functing Displayzhang ping 315.10 315.60 665.70zhang ping 519.50 410.50 930.00After Call-Functing Displayzhang ping 315.10 315.60 665.70,定义函数display,其形参p为结构体变量,例9-6 用数据复制方式传递结构体变量的说明,p,teacher,1.调用函数display:调用时把结构体变量teacher作为实参传递给被调用函数的形参p。实参、形参具有相同的结构体类型。P接收调用时传递给被调用函数的数据。2.结构体变量p和teacher在运行时占用互不相同的存储空间。在传递参数时,把teacher的各个成员的值复制给p的各个成员。3.形参和实参代表两个不同的结构体变量,其结构体类型相同,但运行时分配不同的存储空间。但被调用函数不能修改实参所对应的结构体变量。,9.5 结构体在函数间的传递,9.5.1 结构体变量的传递,采用地址复制方式传递结构体变量时,实参是结构体变量的地址,形参是与实参有相同结构体类型的指针,该指针用来接收传递的结构体变量首地址。被调用函数通过该指针来处理实参所对应的结构体变量的各成员。用地址复制方式传递结构体变量是常用的传递方式。所以,利用地址复制方式传递结构体变量时,被调用函数可以修改结构体变量的成员。,2.用地址复制方式传递结构体变量(传址方式),10#include20#include30struct date/*定义结构体*/40 int day;50 int month;60 int year;70 char name20;80;90 main()100 struct date ymd;110 struct date*pd;120 pd=/*给结构体变量ymd赋值*/,例9-7 程序处理采用地址复制方式。,日,月。年。,150 printf(%d,%d,%d,%sn,(*pd).year,(*pd).month,(*pd).day,(*pd).name);160 day(210,程序运行,Enter year-month-day:2001,9,1,zhang 2001,9,1,zhang2002,9,1,zhang,例9.7的说明:在调用day()函数时,其实参是结构体变量的首地址&ymd。day()函数的定义中,形参pd是与实参具有相同结构体类型的指针变量,该指针变量接收传递过来的实参地址,即结构体变量ymd的首地址。函数通过pd访问结构体变量ymd,并可修改其成员值,例如:pd-year=2002将ymd变量的year值改为2002。,9.5.2 结构体数组在函数间的传递,例9-8 的说明:主函数main()定义的结构体数组list,用于存放学生的成绩册。函数调用input(&listi)中的实参是结构体数组listi的首地址。input()函数用于建立该成绩册,用于输入一个学生的有关信息;其形参sp是一个struct student 结构体类型的指针,用于接收结构体数组(元素)的首地址。display()函数用于显示学生的成绩册。函数调用display(list,i)中的实参list是结构体数组名,i 是输入第几个学生的数。display()函数调用时,其形参pm是struct student结构体类型的指针,用于接收结构体数组(元素的首地址。,函数不仅可以传递一般结构体变量,而且还可以传递结构体数组。在传递结构体数组时,实参是数组名,即结构体数组的地址;形参是结构体指针,它接收传递过来的数组首地址,使它指向实参所表示的结构体数组。,例9-8 学生成绩册的建立和显示。采用结构体数组在函数间的传递。,10#include 20#define MAX 230struct student40 char id6;50 char name20;60 int score;70;80 main()90 struct student listMAX;100 int i;110 for(i=0;iMAX;i+)120 if(input(160,170 input(sp)180 struct student*sp;190 char s5;200 printf(nEnter ID:);210 gets(sp-id);220 printf(Enter Name:);230 gets(sp-name);240 if(sp-name0=0)250 return(0);260 printf(Enter score:);270 gets(s);280 sp-score=atoi(s);290 return(1);300 310 display(pm,m)320 struct student*pm;330 int m;340 int i;350 printf(-n);360 for(i=0;iid,pm-name,pm-score);380,input()函数的作用是给结构体变量中各成员赋值,display()函数的作用是显示结构体变量中各成员的值,若不给结构体成员name赋值仅按,则函数input()返回值为0。,9.6 结构体型和结构体指针型函数,9.6.1 结构体型函数 9.6.2 结构体指针型函数,9.6 结构体型和结构体指针型函数,结构体型函数说明的一般形式:,9.6.1 结构体型函数,如果函数返回值是某一结构体变量时,则称该函数是结构体型函数,该函数的数据类型就是这个结构体变量所具有的结构体类型。,结构体型函数定义的一般形式:,struct 结构体名 函数名(形参表)形参说明;内部数据说明语句;执行语句;return(结构体变量);,struct 结构体名 函数名();,#include struct datatype char str20;int x;float y;main()struct datatype rev;struct datatype func();printf(Call Function n);rev=func();printf(rev.str=%s rev.x=%d rev.y=%.2fn,rev.str,rev.x,rev.y);struct datatype func()struct datatype test;strcpy(test.str,test string);test.x=45;test.y=147.45;printf(test.str=%s test.x=%d test.y=%.2f n,test.str,test.x,test.y);printf(After return n);return(test);,例 9-9 返回值为结构体变量的函数。,定义结构体型函数,结构体函数的说明,程序运行,Call Functiontest.str=test string test.x=45 test.y=147.45After returnrev.str=test string rev.x=45 rev.y=147.45,调用函数,例9-9 的说明:函数func()被定义为结构体型函数,其类型为struct datatype。在main()函数中,rev也是struct datatype类型的结构体变量,它与func()的类型相同,用rev 接收函数func()的返回值。从运行结果看,结构体变量中各成员的值与test结构体变量相同。因此,rev=func()可以看作结构体变量之间的赋值操作。,9.6.2 结构体指针型函数,在调用结构体指针型函数时,用于接收结构体指针型函数返回值的变量应该是指向与该函数具有相同结构体类型的结构体指针变量。,当函数的返回值是结构体变量的首地址时,称该函数为结构体指针型函数,该函数的数据类型为结构体指针型。,结构体指针型函数定义形式:,struct 结构体名*函数名(形参表)形参说明;内部数据说明语句;执行语句;return(结构体变量地址);,结构体指针型函数说明的一般形式:,struct 结构体名*函数名();,例9-10 实现电话号码查寻。假设有一个电话号码表,给一个电话号码找出该号码对应的信息。,函数功能:建立电话号码表函数,当输入的电话号码为0时,结束电话号码的输入。(if语句中判断条件为真,break强制程序退出循环),#define NULL 0struct sample int num;char name20;char addr80;list50;tell_list()int i;for(i=0;i50;i+)printf(n Enter tel.number:);scanf(%d,struct sample*found(n)int n;int i;for(i=0;inum!=NULL)printf(n Number=%d,ps-num);printf(n Name=%s,ps-name);printf(n Address=%s,ps-addr);else printf(n Not found!);,定义结构体指针型函数。函数功能:根据给出的电话号码查着对应的信息。,输入查找的电话号码为0,则退出程序。(if语句中判断条件为真,break强制程序结束)。,函数返回值是结构体变量listi的首地址,结构体指针的说明,调用结构体指针型函数,注意:结构体指针型函数返回结构体首地址,但该结构体一定不能是该函数中定义的自动型结构体变量。,9.7 共用体简介,9.7.1共用体的说明9.7.2共用体变量或数组的定义9.7.3共用体变量或数组元素的引用,在程序运行过程中,有时需要使用几种不同类型的变量存放到同一个段内存单元中。例如,可把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同,但都从同一个地址开始存放。也就是使用了覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为“共用体”。它是一种类似于结构体的构造型数据类型,它准许不同类型和不同长度的数据共享同一块存储空间。,9.7 共用体简介,共用体的说明形式为:union 共用体名 数据类型 1 成员1名;数据类型 2 成员2名;数据类型 n 成员n名;;,注意:1.每个成员都从第一个字节开始连续存放.2.共用体中的成员不能同时使用.3.占用字节数等于占用内存最多的成员占用的单元数.,例如:union cif char c1100;int i2100;float f3100;,Cif占用单元数:400,9.7.1 共用体的说明,同结构体相同,也有三种方法.,(1)在共用体说明的同时定义共用体变量其定义格式为:union 共用体名 共用体成员表;共用体变量名表;例 union su int a10;float y;long u;union su u1,u210;,9.7.2共用体变量或数组的定义,(2)直接定义共用体变量其定义形式为:struct 共用体成员表;共用体变量名表;这种定义形式不出现共用体名例:union int a10;float y;long u;u1,u210;,9.7.2共用体变量或数组的定义,(3)把定义和说明分开其定义格式为:union 共用体名 共用体成员表;.存贮类型 union 共用体名 共用体变量名表;union int a10;float y;long u;union su u1,u210;,9.7.2共用体变量或数组的定义,同结构体相同,只能引用成员。有三种方式:,(1)用指针的方式 定义一个指针(共用体指针),使它指向该共用体变量,这时就可用指针和成员名来引用共用体成员了。其格式为:(*指针名).共用体成员名(2)用共用体成员运算符方式(.)用共用体成员运算符“.”引用共用体成员格式:共用体变量名.共用体成员名(3)用“-”指向运算符引用共用体成员定义一个指针(共用体指针),使它指向该共用体变量,这时就可用指针和