《C程序设计配套谭浩强用户自己建立数据类型.pptx》由会员分享,可在线阅读,更多相关《C程序设计配套谭浩强用户自己建立数据类型.pptx(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、会计学1C程序设计配套谭浩强程序设计配套谭浩强 用户用户(yngh)自自己建立数据类型己建立数据类型第一页,共53页。9.1 定义定义(dngy)和使用结和使用结构体变量构体变量9.1.1 9.1.1 自己建立结构自己建立结构(jigu)(jigu)体类型体类型9.1.2 9.1.2 定义结构定义结构(jigu)(jigu)体类型变量体类型变量9.1.3 9.1.3 结构结构(jigu)(jigu)体变量的初始化和引用体变量的初始化和引用第1页/共53页第二页,共53页。9.1.1 自己自己(zj)建立结构体建立结构体类型类型n n用户自己建立由不同类型数据组成的组合型的数据结构,它称用户自己
2、建立由不同类型数据组成的组合型的数据结构,它称为结构体。为结构体。n n例如,一个学生的学号、姓名、性别、年龄、成绩例如,一个学生的学号、姓名、性别、年龄、成绩(chngj)(chngj)、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如如student_1student_1的变量,反映它们之间的内在联系。的变量,反映它们之间的内在联系。第2页/共53页第三页,共53页。9.1.1 自己建立结构自己建立结构(jigu)体类型体类型struct Studentstruct Student int num int num;char
3、name20 char name20;char sex char sex;int age int age;float score float score;char addr30 char addr30;u由程序设计者指定了一个结由程序设计者指定了一个结构构(jigu)体类型体类型struct Student。u它包括它包括num,name,sex,age,score,addr等不同类型的成员。等不同类型的成员。第3页/共53页第四页,共53页。9.1.1 自己建立自己建立(jinl)结构结构体类型体类型n n声明一个声明一个(y(y )结构体类型的一般形式为:结构体类型的一般形式为:n n s
4、truct struct 结构体名结构体名n n 成员表列成员表列 ;类型类型(lixng)名名 成员名成员名;第4页/共53页第五页,共53页。9.1.1 自己建立结构自己建立结构(jigu)体类型体类型n n说明:说明:n n(1)(1)可以根据需要设计出多种结构体类型可以根据需要设计出多种结构体类型(lixng)(lixng),例如,例如n nstruct Teacherstruct Teachern nstruct Workerstruct Workern nstruct Datestruct Date等结构体类型等结构体类型(lixng)(lixng)n n各自包含不同的成员各自包含
5、不同的成员第5页/共53页第六页,共53页。9.1.1 自己建立结构自己建立结构(jigu)体类型体类型n n说明:说明:n n(2)(2)结构体成员可以结构体成员可以(ky(ky)属于另一个结构体类型。属于另一个结构体类型。n n struct Date struct Date n n int month;int day;int year;int month;int day;int year;n nstruct Stu struct Stu n n int num;char name20;int num;char name20;n n char sex;int age;char sex;in
6、t age;n n struct Date birthday;struct Date birthday;n n char addr30;char addr30;n n;numnamesexagebirthdayaddrmonthdayyear第6页/共53页第七页,共53页。9.1.2 定义定义(dngy)结构体结构体类型变量类型变量1.1.先声明结构先声明结构(jigu)(jigu)体类型,再定义该类型变量体类型,再定义该类型变量struct Studentstruct Student int num;int num;char name20;char name20;char sex;char
7、 sex;int age;int age;float score;float score;char addr30;char addr30;struct Student student1,student2;struct Student student1,student2;结构结构(jigu)体类型名体类型名结构体变量名结构体变量名 第7页/共53页第八页,共53页。9.1.2 定义结构体类型定义结构体类型(lixng)变量变量2.2.在声明类型的同时在声明类型的同时(tngsh)(tngsh)定义变量定义变量struct Studentstruct Student int num;int num
8、;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr30;char addr30;student1,student2;student1,student2;第8页/共53页第九页,共53页。9.1.2 定义结构体类型定义结构体类型(lixng)变量变量3.3.不指定不指定(zh(zh dng)dng)类型名而直接定义结构体类型变量类型名而直接定义结构体类型变量structstruct int num;int num;char name20;char name20;c
9、har sex;char sex;int age;int age;float score;float score;char addr30;char addr30;student1,student2;student1,student2;第9页/共53页第十页,共53页。9.1.2 定义定义(dngy)结构体结构体类型变量类型变量(1)(1)结构体类型与结构体变量是不同的概念,不要混同。只能结构体类型与结构体变量是不同的概念,不要混同。只能(zh(zh nnnn)对变量赋值、存取或运算,而不能对一个类型赋值、存取或运对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配
10、空间的,只对变量分配空间。算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。表同一对象。(3)(3)结构体变量中的成员可以单独使用,它的作用与地位相当于普通结构体变量中的成员可以单独使用,它的作用与地位相当于普通变量。变量。第10页/共53页第十一页,共53页。9.1.3 结构结构(jigu)体变量体变量的初始化和引用的初始化和引用 例例9.1 把一个学生的信息把一个学生的信息(包括学号、姓名包括学号、姓名(xngmng)、性别、住址、性别、住址)放在一个
11、结构体放在一个结构体变量中,然后输出这个学生的信息。变量中,然后输出这个学生的信息。#include int main()struct student long int num;char name20;char sex;char addr20;a=10101,Li Lin,M,123 Beijing Road;printf(NO.:%ldnname:%snsex:%cnaddress:%sn,a.num,a.name,a.sex,a.addr);return 0;第11页/共53页第十二页,共53页。#include#include int main()int main()struct Stu
12、dent struct Student long int num;char name20;long int num;char name20;char sex;char addr20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;a=10101,“Li Lin”,M,“123 Beijing Road”;a.num=10010;a.num=10010;对对 printf(“%sn”,a);printf(“%sn”,a);不对不对 第12页/共53页第十三页,共53页。#include#include int main()in
13、t main()struct Student struct Student long int num;char name20;long int num;char name20;char sex;char addr20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;a=10101,“Li Lin”,M,“123 Beijing Road”;struct Student b;struct Student b;b=a;b=a;对对 b.num+;b.num+;对对 第13页/共53页第十四页,共53页。#include#incl
14、ude int main()int main()struct Student struct Student long int num;char name20;long int num;char name20;char sex;char addr20;char sex;char addr20;a=10101,“Li Lin”,M,“123 Beijing Road”;a=10101,“Li Lin”,M,“123 Beijing Road”;scanf(scanf(%ld%ld,&a.num);,&a.num);对对 printf(printf(%o%o,&a);,&a);对对 scanf(“%
15、ld,%s,%c,%sn”,&a);scanf(“%ld,%s,%c,%sn”,&a);错错 第14页/共53页第十五页,共53页。#include#include int main()int main()struct Date struct Date int month;int month;int day;int year;int day;int year;struct Stu struct Stu int num;char name20;int num;char name20;char sex;int age;char sex;int age;struct Date struct Date
16、 birthday;birthday;char addr30;char addr30;a,b;a,b;a.birthday.month=12;a.birthday.month=12;对对 a.age=10;b.age=9;a.age=10;b.age=9;对对 sum=a.age+b.age;sum=a.age+b.age;对对 第15页/共53页第十六页,共53页。例例9.2 输入两个学生输入两个学生(xu sheng)的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩,输出成绩较高学生(xu sheng)的学号、姓的学号、姓名和成绩。名和成绩。#include int main()st
17、ruct stu int num;char name20;float score;stu1,stu2;scanf(%d%s%f,&stu1.num,stu1.name,&stu1.score);scanf(%d%s%f,&stu2.num,stu2.name,&stu2.score);printf(The higher score is:n);if(stu1.scorestu2.score)printf(%d%s%6.2fn,stu1.num,stu1.name,stu1.score);else if(stu1.scorestu2.score)printf(%d%s%6.2fn,stu2.nu
18、m,stu2.name,stu2.score);else printf(%d%s%6.2fn,stu1.num,stu1.name,stu1.score);printf(%d%s%6.2fn,stu2.num,stu2.name,stu2.score);return 0;第16页/共53页第十七页,共53页。9.2 使用使用(shyng)结构体结构体数组数组9.2.1 9.2.1 定义结构体数组定义结构体数组9.2.2 9.2.2 结构体数组的应用结构体数组的应用(yngyng)(yngyng)举例举例第17页/共53页第十八页,共53页。9.2.1定义定义(dngy)结构体结构体数组数组 例
19、例9.3 9.3 有有3 3个候选人,每个选民只能投票选一人,要个候选人,每个选民只能投票选一人,要求编一个求编一个(y(y )统计选票的程序,先后输入被选人的名统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。字,最后输出各人得票结果。第18页/共53页第十九页,共53页。#include#include#include#include struct Person struct Person char name20;char name20;int count;int count;leader3=leader3=“Li”,0“Li”,0,“Zhang”,0“Zhang”,0,“Sun
20、”,0“Sun”,0;全局全局(qunj)的结构体数组的结构体数组namecountleader0Li0Zhang0Sun0第19页/共53页第二十页,共53页。int main()int main()int i,j;char leader_name20;int i,j;char leader_name20;for(i=1;i=10;i+)for(i=1;i=10;i+)scanf(“%s”,leader_name);scanf(“%s”,leader_name);for(j=0;j3;j+)for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0
21、)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;leaderj.count+;for(i=0;i3;i+)for(i=0;i3;i+)printf(%5s:%dn“,leaderi.name,leaderi.count);printf(%5s:%dn“,leaderi.name,leaderi.count);return 0;return 0;第20页/共53页第二十一页,共53页。n n说明:说明:n n(1)(1)定义定义(dngy)(dngy)结构体数组一般形式是结构体数组一般形式是n n struct struct 结构体名结
22、构体名n n 成员表列成员表列 数组名数组名 数组长度数组长度;n n 先声明一个结构体类型,然后再用此类型定义先声明一个结构体类型,然后再用此类型定义(dngy)(dngy)结构体数组:结构体数组:n n 结构体类型结构体类型 数组名数组名 数组长度数组长度;n n 如:如:n n struct Person leader3;struct Person leader3;n n(2)(2)对结构体数组初始化的形式是在定义对结构体数组初始化的形式是在定义(dngy)(dngy)数组的后面加上:数组的后面加上:n n初值表列初值表列;n n 如:如:n nstruct Person leader3
23、=Li,0,Zhang,0,Fun,0;struct Person leader3=Li,0,Zhang,0,Fun,0;第21页/共53页第二十二页,共53页。9.2.2 结构体数组的应用结构体数组的应用(yngyng)举例举例 例例9.4 9.4 有有n n个学生的信息个学生的信息(包括学号、姓名、成绩包括学号、姓名、成绩),要,要求求(yoqi)(yoqi)按照成绩的高低顺序输出各学生的信息。按照成绩的高低顺序输出各学生的信息。第22页/共53页第二十三页,共53页。#include struct student int num;char name20;float score;int m
24、ain()struct student stu5=10101,Zhang,78,10103,Wang,98.5,10106,Li,86,10108,Ling,73.5,10110,Fun,100 ;struct student temp;const int n=5;int i,j,k;printf(The order is:n);for(i=0;in-1;i+)k=i;for(j=i+1;jstuk.score)k=j;temp=stuk;stuk=stui;stui=temp;for(i=0;in;i+)printf(%6d%8s%6.2fn,stui.num,stui.name,stui.
25、score);return 0;第23页/共53页第二十四页,共53页。9.3 结构结构(jigu)体指针体指针9.3.1 9.3.1 指向结构指向结构(jigu)(jigu)体变量的指针体变量的指针9.3.2 9.3.2 指向结构指向结构(jigu)(jigu)体数组的指针体数组的指针9.3.3 9.3.3 用结构用结构(jigu)(jigu)体变量和结构体变量和结构(jigu)(jigu)体变量的指针体变量的指针作函数参数作函数参数第24页/共53页第二十五页,共53页。9.3.1 指向结构体变量指向结构体变量(binling)的指针的指针n n指向结构体对象的指针变量既可以指向结构体变量
26、,指向结构体对象的指针变量既可以指向结构体变量,也可以用来引用结构体数组中的元素。也可以用来引用结构体数组中的元素。n n指针变量的基类型必须与结构体变量的类型相同。例指针变量的基类型必须与结构体变量的类型相同。例如:如:n n struct Student*pt;struct Student*pt;n n例例9.5 9.5 通过通过(tnggu)(tnggu)指向结构体变量的指针变量输出指向结构体变量的指针变量输出结构体变量中成员的信息。结构体变量中成员的信息。第25页/共53页第二十六页,共53页。#include#include int main()struct student long
27、 num;char name20;char sex;float score;struct student stu_1;struct student*p;p=&stu_1;stu_1.num=10101;strcpy(stu_1.name,Li Lin);stu_1.sex=M;stu_1.score=89.5;printf(No.:%ldnname:%snsex:%cnscore:%5.1fn,stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf(“nNo.:%ldnname:%snsex:%cnscore:%5.1fn,(*p).num,(*p
28、).name,(*p).sex,(*p).score);return 0;第26页/共53页第二十七页,共53页。n n说明:说明:n n为了使用方便和直观,为了使用方便和直观,n nC C语言允许把语言允许把(*p).num(*p).num用用p-nump-num来代替来代替n n即即:(*p).name(*p).namep-namep-namen n如果如果p p指向一个结构体变量指向一个结构体变量stustu,以下,以下(y(y xi)xi)等价:等价:n n stu.stu.成员名成员名(如如stu.num)stu.num)n n (*p).(*p).成员名成员名(如如(*p).num
29、)(*p).num)n n p-p-成员名成员名(如如p-num)p-num)第27页/共53页第二十八页,共53页。9.3.2 指向结构指向结构(jigu)体体数组的指针数组的指针 例例9.6 9.6 有有3 3个学生的信息,放在结构体数组中,要求输出个学生的信息,放在结构体数组中,要求输出(shch)(shch)全部学生的信息。全部学生的信息。第28页/共53页第二十九页,共53页。#include struct student int num;char name20;char sex;int age;struct student stu3=10101,Li Lin,M,18,10102,
30、Zhang Fun,M,19,10104,Wang Min,F,20;int main()struct student*p;printf(No.Name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);return 0;第29页/共53页第三十页,共53页。9.3.3 9.3.3 用结构用结构用结构用结构(jigu)(jigu)体变量和结构体变量和结构体变量和结构体变量和结构(jigu)(jigu)体变量的指针体变量的指针体变量的指针体变量的指针作函数参数作函数参数作函数参数作函数参数n n将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传
31、递给另一个函数,有3 3个方法。个方法。n n(1)(1)用结构体变量的成员作参数。用结构体变量的成员作参数。n n用法和用普通变量作实参是一样的,属于用法和用普通变量作实参是一样的,属于“值传递值传递”方式。方式。n n应当注意实参与形参的类型保持一致。应当注意实参与形参的类型保持一致。n n(2)(2)用结构体变量作实参。用结构体变量作实参。n n用结构体变量作实参时,将结构体变量所占的内存单元用结构体变量作实参时,将结构体变量所占的内存单元(dnyun)(dnyun)的内的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量。容全部按顺序传递给形参,形参也必须是同类型的结构体变量。n
32、 n在函数调用期间形参也要占用内存单元在函数调用期间形参也要占用内存单元(dnyun)(dnyun)。这种传递方式在空。这种传递方式在空间和时间上开销较大。间和时间上开销较大。n n在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数。函数。n n一般较少用这种方法。一般较少用这种方法。n n(3)(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。(或数组元素)的地址传给形参。第30页/共53页第三十一页,共53页。例例9.7
33、 有有n个结构体变量,内含学生学号、姓名个结构体变量,内含学生学号、姓名(xngmng)和和3门课程的成绩。要求输出平门课程的成绩。要求输出平均成绩最高的学生的信息均成绩最高的学生的信息(包括学号、姓名包括学号、姓名(xngmng)、3门课程成绩和平均成绩门课程成绩和平均成绩)。#include#define N 3struct student int num;char name20;float score3;float aver;void input(struct student stu);struct student max(struct student stu);void print(s
34、truct student stu);int main()struct student stuN,*p=stu;input(p);print(max(p);return 0;第31页/共53页第三十二页,共53页。void input(struct student stu)int i;printf(请输入各学生的信息:学号、姓名请输入各学生的信息:学号、姓名(xngmng)、三门课成绩、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%f%f,&stui.num,stui.name,&stui.score0,&stui.score1,&stui.score2);stui.
35、aver=(stui.score0+stui.score1+stui.score2)/3.0;第32页/共53页第三十三页,共53页。struct student max(struct student stu)int i,m=0;for(i=0;istum.aver)m=i;return stum;void print(struct student stud)printf(n成绩最高的学生是成绩最高的学生是:n);printf(学号学号:%dn姓名姓名:%sn三门三门(sn mn)课成绩课成绩:%5.1f,%5.1f,%5.1fn平均成绩平均成绩:%6.2fn,stud.num,stud.na
36、me,stud.score0,stud.score1,stud.score2,stud.aver);第33页/共53页第三十四页,共53页。n n以上以上3 3个函数的调用,情况各不相同:个函数的调用,情况各不相同:n n调用调用inputinput函数时,实参是指针变量,形参是结构体数组,传递函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址的是结构体元素的地址(dzh(dzh),函数无返回值。,函数无返回值。n n调用调用maxmax函数时,实参是指针变量,形参是结构体数组,传递函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址的是结构体元素的地址(dzh(
37、dzh),函数的返回值是结构体类型,函数的返回值是结构体类型数据。数据。n n调用调用printprint函数时,实参是结构体变量,形参是结构体变量,传函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。递的是结构体变量中各成员的值,函数无返回值。第34页/共53页第三十五页,共53页。9.4 用指针用指针(zhzhn)处处理链表理链表9.4.1 9.4.1 什么是链表什么是链表9.4.2 9.4.2 建立建立(jinl)(jinl)简单的静态链表简单的静态链表9.4.3 9.4.3 建立建立(jinl)(jinl)动态链表动态链表9.4.4 9.4.4
38、输出链表输出链表第35页/共53页第三十六页,共53页。9.4.1 什么什么(shn me)是是链表链表n n链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构n n它是动态地进行存储它是动态地进行存储(cn ch(cn ch)分配的一种结构分配的一种结构head12491249A135613561475B1475C10211021D0头指针头指针(zhzhn)各结点地址不连续各结点地址不连续各结点含有两个部分各结点含有两个部分表尾表尾第36页/共53页第三十七页,共53页。struct Studentstruct Student int num;int num;float scor
39、e;float score;struct Student struct Student*next;*next;a,b,ca,b,c;1010189.510103901010785a结点结点(ji din)b结点结点(ji din)c结点结点(ji din)a.next=&b;b.next=&c;numscorenext第37页/共53页第三十八页,共53页。9.4.2 建立建立(jinl)简单的简单的静态链表静态链表 例例9.8 9.8 建立一个如图所示的简单链表,它由建立一个如图所示的简单链表,它由3 3个学生个学生数据的结点组成,要求输出各结点中的数据。数据的结点组成,要求输出各结点中的数
40、据。解题解题(ji t)(ji t)思路:思路:head=&a;a.next=&b;head=&a;a.next=&b;b.next=&c;c.next=NULL;b.next=&c;c.next=NULL;head1010189.510103901010785a结点结点(ji din)b结点结点c结点结点numscorenextNULL第38页/共53页第三十九页,共53页。#include struct student int num;float score;struct student*next;int main()struct student a,b,c,*head,*p;a.num=
41、10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do printf(%ld%5.1fn,p-num,p-score);p=p-next;while(p!=NULL);return 0;第39页/共53页第四十页,共53页。9.4.3 建立建立(jinl)动态链动态链表表n n所谓建立动态链表是指在程序执行过程所谓建立动态链表是指在程序执行过程(guchng)(guchng)中中从无到有地建立起一个链表,即一个一个地开辟结
42、点从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。和输入各结点数据,并建立起前后相链的关系。n n例例9.9 9.9 写一函数建立一个有写一函数建立一个有3 3名学生数据的单向动态链名学生数据的单向动态链表。表。第40页/共53页第四十一页,共53页。#include#include#define LEN sizeof(struct student)int n;struct student long num;float score;struct student*next;struct student*creat(void);int main()struc
43、t student*pt;pt=creat();printf(nnum:%ldnscore:%5.1fn,pt-num,pt-score);return 0;第41页/共53页第四十二页,共53页。struct student*creat(void)struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2=p1;p1=(str
44、uct student*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);p2-next=NULL;return(head);第42页/共53页第四十三页,共53页。9.4.4 输出输出(shch)链表链表例例9.10 9.10 编写一个编写一个(y(y )输出链表的函数输出链表的函数printprint。void print(struct Student*p)void print(struct Student*p)printf(nThese%d records are:n,n);printf(nThese%d records are:n,n);if(p
45、!=NULL)if(p!=NULL)do do printf(%ld%5.1fn“,p-num,p-score);printf(%ld%5.1fn“,p-num,p-score);p=p-next;p=p-next;while(p!=NULL);while(p!=NULL);第43页/共53页第四十四页,共53页。9.5 共用共用(n yn)体体类型类型9.5.1 9.5.1 什么是共用体类型什么是共用体类型9.5.2 9.5.2 引用共用体变量的方式引用共用体变量的方式(fngsh)(fngsh)9.5.3 9.5.3 共用体类型数据的特点共用体类型数据的特点第44页/共53页第四十五页,共
46、53页。什么是共用什么是共用(n yn)体类型体类型n n有时想用同一段内存单元存放不同类型的变量。有时想用同一段内存单元存放不同类型的变量。n n使几个使几个(j(j )不同的变量共享同一段内存的结构,不同的变量共享同一段内存的结构,称为称为“共用体共用体”类型的结构。类型的结构。1000100110021003字符字符(z f)ch整型变量整型变量i实型变量实型变量f第45页/共53页第四十六页,共53页。n n定义共用体类型变量的一般形式为:定义共用体类型变量的一般形式为:n nunion union 共用体名共用体名n n n n 成员表列成员表列n n 变量表列;变量表列;n n“共
47、用体共用体”与与“结构结构(jigu)(jigu)体体”的定义形式相似,但它们的定义形式相似,但它们的含义是不同的。的含义是不同的。n n结构结构(jigu)(jigu)体变量所占内存长度是各成员占的内存长度之体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。占的内存长度等于最长的成员的长度。n n只有先定义了共用体变量才能引用它,但应注意,不能引用只有先定义了共用体变量才能引用它,但应注意,不能引用共用体变量,而只能引用共用体变量中的成员。共用体变量,而只能引用共用
48、体变量中的成员。第46页/共53页第四十七页,共53页。例如:前面定义了例如:前面定义了a,b,ca,b,c为共用为共用(nn yn yn)体变量,下面的引体变量,下面的引用方式是正确的:用方式是正确的:a.i a.ch a.f a.i a.ch a.f 例如例如(lr):union Data int i;char ch;float f;a,b,c;例如例如(lr):union Data int i;char ch;float f;union Data a,b,c;第47页/共53页第四十八页,共53页。n n共用体类型数据的特点:共用体类型数据的特点:n n(1)(1)同一个内存段可以用来存
49、放几种不同类型的成员,但在每一瞬同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。时只能存放其中一个成员,而不是同时存放几个。n n(2)(2)可以对共用体变量初始化,但初始化表中只能有一个常量可以对共用体变量初始化,但初始化表中只能有一个常量(chngling)(chngling)。n n(3)(3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。n n(4)(4)共用体
50、变量的地址和它的各成员的地址都是同一地址。共用体变量的地址和它的各成员的地址都是同一地址。n n(5)(5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。值。n n(6)(6)以前的以前的C C规定不能把共用体变量作为函数参数,但可以使用指向规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针作函数参数。共用体变量的指针作函数参数。C99C99允许用共用体变量作为函数参数。允许用共用体变量作为函数参数。n n(7)(7)共用体类型可以出现在结构体类型定义中,也可以定义共用体共用体类型可以出现在结构体类型定义中,也可以