第10章 结构体与共用体

上传人:汽*** 文档编号:569844870 上传时间:2024-07-31 格式:PPT 页数:49 大小:1.16MB
返回 下载 相关 举报
第10章 结构体与共用体_第1页
第1页 / 共49页
第10章 结构体与共用体_第2页
第2页 / 共49页
第10章 结构体与共用体_第3页
第3页 / 共49页
第10章 结构体与共用体_第4页
第4页 / 共49页
第10章 结构体与共用体_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第10章 结构体与共用体》由会员分享,可在线阅读,更多相关《第10章 结构体与共用体(49页珍藏版)》请在金锄头文库上搜索。

1、第第10章章 结构体与共用结构体与共用体体自定义类型标识符自定义类型标识符结构体的定义与引用结构体的定义与引用共用体的定义与引用共用体的定义与引用10.1 自定义类型标识符自定义类型标识符 C 语言可以通过语言可以通过 typedef 语句,定义自己的数据类型。实语句,定义自己的数据类型。实际上是给际上是给 C 现有类型重新起个名字,即自定义类型标识符。现有类型重新起个名字,即自定义类型标识符。typedef语句的格式:语句的格式:typedef 现有类型现有类型名名 新类型名新类型名;C语言的类型符语言的类型符用户定义的类型符用户定义的类型符例如:例如:例如:例如:基本类型基本类型 type

2、def int INTEGER; typedef float REAL;数组数组 typedef int ARRAY100;typedef char * POINTER;int i;float x;INTEGER i ;REAL x;就可以写成就可以写成int a100,b100;char *pa,*pb;ARRAY a,b ;POINTER pa,pb;就可以写成就可以写成1、先按定义变量的方法写出定义语句、先按定义变量的方法写出定义语句; 如如: int a10;2、将变量名用新类型名替换;、将变量名用新类型名替换; 如如: int ARRAY10;3、再在最前面加、再在最前面加typed

3、ef; 如如: typedef int ARRAY10;4、然后就可以用新类型名定义变量。、然后就可以用新类型名定义变量。 如如: ARRAY a,b,c; 用用typedef定义新类型的步骤定义新类型的步骤注意:注意: typedef typedef 并不创建新的类型并不创建新的类型 结构体导入结构体导入 一组相同类型的数据我们可以用数组来处理,但是在实际应用一组相同类型的数据我们可以用数组来处理,但是在实际应用中,经常有一些既有联系,类型又不同的数据需要一起处理。中,经常有一些既有联系,类型又不同的数据需要一起处理。如:学生的基本信息如:学生的基本信息 字段:字段: 学号学号 姓名姓名 性

4、别性别 地址地址 成绩成绩类型:类型: long char char char floatlong char char char float C C语言允许用户按语言允许用户按自己的需要将不同的基本类型构造成一自己的需要将不同的基本类型构造成一种特殊类型种特殊类型,即,即结构体结构体。结构体的操作分为结构体的操作分为4 4步:步:根据需要根据需要先定义结构体类型先定义结构体类型;然后通过定义的类型然后通过定义的类型定义结构体变量定义结构体变量( (数组、指针数组、指针) );结构体变量结构体变量( (数组、指针数组、指针) )赋值赋值(址);(址);引用结构体变量引用结构体变量( (数组、指针

5、数组、指针) ) 。11.2 结结 构构 体体 定义结构体类型定义结构体类型定义结构体类型定义结构体类型格式:格式:struct 结构名结构名 数据类型数据类型 成员成员1 ; 数据类型数据类型 成员成员2 ; 数据类型数据类型 成员成员n ; ;结构体标志。结构体标志。用标识符命名的结构类型名。用标识符命名的结构类型名。结构类型中所含的结构类型中所含的成员及其类型。成员及其类型。再再再再如定义学生结构体:如定义学生结构体:如定义学生结构体:如定义学生结构体:struct student long num ;/*学号学号*/ char name20 ; /*姓名姓名*/ char sex ;

6、/*性别性别*/ int age ; /*年龄年龄*/ float score ; /*成绩成绩*/ ;如:日期结构体类型如:日期结构体类型struct date int month; int day; int year;或或:struct date int month, day, year ;此处分号不能省略此处分号不能省略;经上面定义之后:经上面定义之后:struct student 和和int , float 等标准类型标识符一样可用来等标准类型标识符一样可用来定义变量、数组、指针变量等定义变量、数组、指针变量等如:如: 学生基本情况学生基本情况 struct student long

7、num;char name20;char sex; int age; struct date birthday;float score; ;struct student long num;char name10;char sex; int age; struct date int year; int month; int day; birthday;float score; ;结构体嵌套:结构体嵌套:一个结构体成员可以又是一个结构体变量。 定义结构变量定义结构变量定义结构变量定义结构变量 定义结构只是确定该定义结构只是确定该结构体类型的名称结构体类型的名称、成员成员及及成员的类成员的类型型。必

8、须通过结构体类型定义变量,才能赋值并使用。必须通过结构体类型定义变量,才能赋值并使用。结构体变量的结构体变量的4种定义方式:种定义方式:先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。struct student long num ; char name20 ; int age ; char add30 ; float score ; ;struct student std1, *pst, pers3;用用struct student 类类型说明型说明3个变量。个变量。定义结构类型的同时定义结构体变量。定义结构类型的同时定义结构体变量。 struct student l

9、ong num;char name20;char sex;int age;float score; std1, *pst, pers3;直接定义结构体变量。直接定义结构体变量。struct long num;char name20;char sex;int age;float score; std, *pstd, pers3;说明:说明: 无结构体名。无结构体名。 注意类型和变量的区别。注意类型和变量的区别。 成员可单独使用。成员可单独使用。如:如:std.age=20std.age=20用用typedeftypedef将结构体类型定义新类型,再定义变量。将结构体类型定义新类型,再定义变量。t

10、ypedef struct student long num;char name20;char sex;int age;float score; STREC;此处分号不能省略此处分号不能省略STREC std,*pstd, pers3 ;定义变量定义变量定义新类型定义新类型1、结构体变量的初始化、结构体变量的初始化例如:例如:例如:例如:结构体变量名结构体变量名=初值初值;注意:注意:初值的个数、顺序、类型应与成员说明一致初值的个数、顺序、类型应与成员说明一致 结构体变量结构体变量(数组、指针数组、指针)的初始化的初始化结构变量结构变量(数组、指针数组、指针)可以在说明时赋初值,称为初始化。可

11、以在说明时赋初值,称为初始化。格式:格式:struct student std=20001struct student std=20001,Li LiLi Li,MM,1919,8585;2、结构体数组的初始化、结构体数组的初始化struct 结构体名结构体名 *结构体数组名结构体数组名 =初始数据初始数据;struct student pers3= 20001, Sun Lin, M, 19 ,85, 20002, Li Si, W, 19, 85, 20003, John, M, 19, 85 ;格式:格式:例如:例如:例如:例如:前面前面4种定义形式均可在定义时对结构体进行初始化。种定义

12、形式均可在定义时对结构体进行初始化。多项数据多项数据之间用逗之间用逗号隔开。号隔开。 结构体数组相当于一个广义的二维数组,结构体数组的初始化与二维数组的初始化类似。 3、结构体指针的初始化、结构体指针的初始化struct 结构体名结构体名 *结构体指针变量名结构体指针变量名=&同类结构体变量名同类结构体变量名 struct student std, *sp=&std ;格式格式1 1:例如:例如:例如:例如:struct 结构体名结构体名 *结构体指针变量名结构体指针变量名=同类结构体数组名同类结构体数组名 格式格式2 2:struct student pers3,sp=pers;例如:例如:

13、例如:例如:举例:定义结构体时初始化举例:定义结构体时初始化#include stdio.hmain() struct student long num; char name20; char *sex; int age ; char addr30 ; wang = 200989001,“王五王五,女女,20,上海上海 ; printf(num=%ld, name=%s, sex=%s, age=%d, addr=%s n, wang.num , wang.name , wang.sex , wang.age , wang.addr);源代码源代码源代码源代码 结构体变量的引用结构体变量的引用

14、方式方式1:结构体变量名结构体变量名.成员名成员名方式方式2:(*指针变量名指针变量名).成员名成员名方式方式3:指针变量名指针变量名-成员名成员名1、结构体成员的引用(、结构体成员的引用(3种方式)种方式)若有:若有:struct student std,pers3,*sp=&std;则 std.num=10101; 等价于等价于 sp-num=10101;std.sex=M;等价于等价于 (*sp).sex=M;std.score=75+8; 等价于等价于 (*sp).score=75+8;std.age+;等价于等价于 sp-age+;. . 成员引用运算符成员引用运算符-指向成员运算符

15、指向成员运算符(1)对对于于结结构构体体类类型型数数组组,要要遵遵循循数数组组元元素素的的引引用用原原则则( 或或*)和)和结构体成员结构体成员的引用原则(的引用原则(. .或或-)。)。引用结构体成员时的注意事项:引用结构体成员时的注意事项:pers2.agepers2.age或或(pers+2)-age(pers+2)-age或或(*(pers+2).age(*(pers+2).agepers.agestd.name2std.name2或或sp-name2sp-name2或(或(* *spsp).name2.name2std.name如:如:pers数组的第数组的第2个元素的成员个元素的成

16、员age如:成员如:成员name数组的第数组的第2个元素个元素(2)对于结构体嵌套,只能引用最低层的成员。)对于结构体嵌套,只能引用最低层的成员。 引用结构体成员时的注意事项:引用结构体成员时的注意事项:struct student long num;char name10;char sex; int age; struct date int year; int month; int day; birthday;float score; std;如如:引用结构体变量引用结构体变量std中的出生月份中的出生月份std.birthday.monthstd.birthday.monthspsp- -

17、birthday.monthbirthday.month(*sp).birthday.month(*sp).birthday.month注意:注意:由外向内逐层引用,由外向内逐层引用,每层之间用点号每层之间用点号“.”分隔。分隔。(3 3)可以)可以对变量、数组元素及其成员进行对变量、数组元素及其成员进行取地址运算取地址运算取结构体变量的地址为:取结构体变量的地址为: & &结构体变量名结构体变量名 如:如:&std&std取结构体成员的地址为:取结构体成员的地址为: & &结构体变量名结构体变量名. .成员成员 如:如:&std.age&std.age(4 4)成员运算符)成员运算符“.”.

18、”和指向运算符和指向运算符“-”-”的优先级最高,结的优先级最高,结合性自右向左。合性自右向左。+sp-num+sp-num等价于等价于+(sp-num)+(sp-num)sp-num+sp-num+等价于等价于(sp-num)+(sp-num)+即即成员成员numnum的值自增的值自增(+sp)-num sp(+sp)-num sp指向下一个元素,再取出该元素成员指向下一个元素,再取出该元素成员numnum的值的值 (sp+)-num (sp+)-num 先取出先取出spsp所指元素成员所指元素成员numnum的值,再指向下一个的值,再指向下一个元素。元素。(5 5)成员运算符的成员运算符的

19、优先级优先级高于地址运算符高于地址运算符(*sp).name(*sp).name 不同于不同于* *sp.namesp.name、* *sp-namesp-name若有若有struct student std=20001,John,M,19,85,*sp=&std;struct student std=20001,John,M,19,85,*sp=&std;则则* *(*sp).name)(*sp).name)值为值为John John 而而* *sp.name sp.name 错误错误但但* *sp-namesp-name值为值为cc(6 6)结构体指针只能指向)结构体指针只能指向同类结构体

20、同类结构体,不能指向结构体成员,不能指向结构体成员若有若有STREC std,*pstd, pers3; 则则sp=&pers2.num 错误错误#include stdio.hmain( ) struct studentlong num;char name20;char sex;float score; s1=20001,Li Li,M,85;struct student s2;float sum, ave;scanf(%ld %s %c %f,&s2.num,s2.name,&s2.sex,&s2.score);sum=s1.score+s2.score;ave=sum/2;printf(

21、NOtNAMEtSEXtSCOREn);printf(%ldt%st%ct%5.1fn,s1.num,s1.name,s1.sex,s1.score);printf(%ldt%st%ct%5.1fn,s2.num,s2.name,s2.sex,s2.score);printf(sum=%5.1ftave=%5.1fn,sum,ave);定义结构体定义结构体student,并初始化变量并初始化变量s1即第即第1个学生信息。个学生信息。定定义变量量s2、sum、ave【例【例10.1】 结构体类型变量的引用示例:结构体类型变量的引用示例:求两个学生总成绩及平均成绩求两个学生总成绩及平均成绩输入第输

22、入第2个学生信息个学生信息计算这两个学生的总成绩、平均成绩计算这两个学生的总成绩、平均成绩输出标题信息输出标题信息输出这两个输出这两个学生信息学生信息输出其总成绩、平均成绩输出其总成绩、平均成绩例例10.110.1(源代码源代码)#include stdio.h#define N 10main( ) struct student int num; float score; studN;float ave=0,max;int i, k=0;printf(input: num, name, score);for(i=0; iN; i+) scanf(%ld,%f,&studi.num,&studi

23、.score);ave=ave+studi.score; ave=ave/N;max=stud0.score;for (i=1; iN; i+)if(maxnum);printf(%st%st%sn,stu1.name,(*sp).name, sp-name); printf(%5.2ft%5.2ft%5.2fn,stu1.score,(*sp).score ,sp-score);【例【例10.3】结构体指针变量的应用:结构体指针变量的应用:求求N N个学生最高分及平均成绩个学生最高分及平均成绩例例10.310.3(源代码源代码)勘误:勘误:P235 sp前加星号前加星号#include st

24、dio.hstruct studentlong num;char name20;float score;struct student stu3= 20001,Li Li,85,20002,Wu an,78,20003,Ma Lin,69;main( )struct student *p;printf(学号t姓名t成绩n);for(p=stu;pnum,p-name,p-score);【例【例10.4】结构体指针变量的应用:结构体指针变量的应用:求求N N个学生最高分及平均成绩个学生最高分及平均成绩例例10.410.4(源代码源代码)学号姓名成绩20001Li Li85.00000020002W

25、u an78.00000020003Ma Lin69.000000输出结果:输出结果:2. 对结构体类型变量的整体赋值对结构体类型变量的整体赋值同种同种类型型的的结构体构体变量之量之间可以可以进行行整体整体赋值操作。操作。例如:struct studentlong num; char name20: char sex; int age; float score; std1, std2=11011, Yang Lin, M, 18, 89;std1=std2; 实际上是将std2的成员分别赋给std1中对应的同名成员。 函数之间结构体变量的数据传递函数之间结构体变量的数据传递3 3种传递方式:种

26、传递方式:l 用结构体变量的用结构体变量的成员成员作参数作参数 结构体变量的成员可以看做普通变量。l 用指向结构体的指针作参数用指向结构体的指针作参数 结构体变量的整体双向传递,形参的改变会影响到实参。 l用结构体变量的整体作参数用结构体变量的整体作参数 结构体变量的整体单向传递,形参的改变不会影响到实参。 例题例题10.5例题例题10.6例题例题10.7传传递递整整体体传传递递成成员员6. 用指针处理链表用指针处理链表 链表作为一种常用的、能够实现动态存储分配的数据结链表作为一种常用的、能够实现动态存储分配的数据结构,是构,是二级公共基础的数据结构二级公共基础的数据结构部分的要点之一。部分的

27、要点之一。 链即用指针连接数据结点。本节重点讲述单链表,其模链即用指针连接数据结点。本节重点讲述单链表,其模型如下:型如下: a1anhead(1)头指针)头指针head指向链表的首结点。指向链表的首结点。(2)每个结点由)每个结点由2个域组成:个域组成:数据域数据域存储结点本身的信息。存储结点本身的信息。指针域指针域指向后继结点的指针。指向后继结点的指针。(3)尾结点的指针域置空()尾结点的指针域置空( NULL ),作为链表结束的标志),作为链表结束的标志数据域数据域数据域数据域 指针指针指针指针域域域域1链表概述链表概述a1a2anhead语言对链表结点的结构描述语言对链表结点的结构描述

28、 在语言中,用结构类型来描述结点结构。例如:在语言中,用结构类型来描述结点结构。例如: struct slist int data;/*数据域数据域*/ struct slist *next;/*指针域指针域*/ ;typedef struct slist SLIST;用于动态分配空间的用于动态分配空间的3个标准函数(个标准函数(stdlib.h)lmalloc(size); 在内存的动态区申请在内存的动态区申请1个长度为个长度为size的存储单元的存储单元lcalloc(n,size); 在内存的动态区申请在内存的动态区申请n个长度为个长度为size的存储单元的存储单元lfree(*ptr)

29、; 释放由释放由ptr指向的存储单元指向的存储单元2. 链表的建立链表的建立例例10.8 编写一个编写一个creat( )函数用于建立一个有函数用于建立一个有5名学生基本数名学生基本数据的单向链表。据的单向链表。其算法步其算法步骤为:(1) 定定义一个描述学生基本数据的一个描述学生基本数据的结构体构体类型。型。(2) 定定义三三个个指指向向结构构体体的的指指针p,q和和head。其其中中head为头指指针;p为当当前前结点点的的指指针;q为当当前前链表表的的表表尾尾结点点指指针。(3) 建立第一个建立第一个结点点(4) 建立其它建立其它节点并完成与当前点并完成与当前链表的表的链接。接。重复步重

30、复步骤(4)就可以完成)就可以完成链表的建立。表的建立。#define N 5#define LEN sizeof(STUD)struct studentint num; float score; struct student *next;typedef struct student STUD ; /* 第(1)步 */STUD *creat( )STUD *head,*p,*q;/* 第(2)步 */ int i; p=( STUD *)malloc(LEN); scanf(%d,%f,&p-num,&p-score); p-next=NULL; head=p; q=p; /* 第(3)步

31、*/ for(i=1;inext=NULL; scanf(%d,%f,&p-num,&p-score); q-next=p; q=p; /* 第(4)步 */ return(head);3. 链表的输出链表的输出例例10.9 编写输出链表的函数编写输出链表的函数print( ) 通过单链表的头指针,首先找到链表的第一个结点;然后顺通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域将搜索到的每个节点的数据域的值输出着结点的指针域将搜索到的每个节点的数据域的值输出void print(STUD *head) STUD *p; p=head; while(p!=NULL) print

32、f(%d,%fn,p-num,p-score); p=p-next; /*指指针移向下一个移向下一个结点点*/ 4. 链表的删除链表的删除例例10.10 编写函数编写函数delete( )实现链表的删除操作实现链表的删除操作基本思路:基本思路: 通过单链表的头指针,首先找到链表的第一个结点;通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到学号为然后顺着结点的指针域找到学号为num的结点,修改其前的结点,修改其前一个节点的指针域的值,使他指向他的下一个结点。一个节点的指针域的值,使他指向他的下一个结点。q-next=p-next;q-next=p-next;free(p);

33、free(p);STUD *delete(STUD *head,int num)STUD *p,*q; if(head=NULL) printf(list null!);!);return(0); p=head; while(num!=p-num & p-next!=NULL)* p指向的不是要找的指向的不是要找的结点,并且后面点,并且后面还有有结点点* q=p;p=p-next; *向后移一个向后移一个结点点* if(num=p-num) *找到了待找到了待删结点点* if(p=head) head=p-next;* 待待删的是第一个的是第一个结点点 * else q-next=p-next

34、;* 待待删的不是第一个的不是第一个结点点 * printf(delete :%dn,p-num); free(p); else *没有找到待没有找到待删结点点* printf(%ld not been found!n,num); return(head);5. 链表的插入链表的插入例例10.11 编写插入结点的函数编写插入结点的函数insert( ),实现在有序链表中,实现在有序链表中结点的插入操作(假设链表按照结点的插入操作(假设链表按照num(学号)从小到大顺(学号)从小到大顺序排列)。序排列)。基本思路:基本思路: 通过单链表的头指针,首先找到链表的第通过单链表的头指针,首先找到链表的

35、第1个结点;然个结点;然后顺着结点的指针域找到值为后顺着结点的指针域找到值为x的节点,然后将新结点的节点,然后将新结点y插插入。入。q-next=p;q-next=p;r-next=q;r-next=q;STUD *insert(STUD *head,STUD *stud) STUD *p,*q,*p0; p=head; /* 设置置扫描指描指针p */ p0=stud; *p0指向要插入的指向要插入的结点点* if(head=NULL) *原来是空表原来是空表* head=p0;p0-next=NULL; else while(p0-nump-num) & (p-next!=NULL) q=

36、p;pp-next; if(p0-numnum) if(head=p)headp0;*插到原来第一个插到原来第一个结点之前点之前* else q-next=p0; *插到插到q指向的指向的结点之后点之后* p0-next=p; else p-next=p0;p0-next=NULL;*插到最后的插到最后的结点之后点之后* return(head););例例10.12 编写主函数调用以上各函数编写主函数调用以上各函数STUD *creat( );void print(STUD *head);STUD *delete(STUD *head,int num);STUD *insert(STUD *h

37、ead,STUD *stud);main( ) STUD *head ,*stu; int del_num; printf(input records :n); head=creat( ); * 建立建立单链表,返回表,返回头指指针 * print(head); *输出出链表中全部表中全部结点数据域的点数据域的值* printf(input the deleted number:); scanf(%d,&del_num);*输入要入要删除的学号除的学号* while(del_num!=0) head=delete(head,del_num);* 返回返回删除除结点后点后链表的表的头指指针 *

38、print(head); printf(input the deleted number:); scanf(%d,&del_num);*输入要入要删除的学号除的学号* printf(input the inserted record:n); stu=(STUD *)malloc(LEN); scanf(%d,%f,&stu-num,&stu-score);*输人要插入的人要插入的记录* while(stu-num!=0) head=insert(head,stu);*返回插入新返回插入新结点后的点后的链表表头指指针* print(head);); printf(input the insert

39、ed record:n); stu=( STUD *)malloc(LEN); scanf(%d,%f,&stu-num,&stu-score);*输人要插入的人要插入的记录* 共用体是指不同类型的数据可以在不同的时间内使用共共用体是指不同类型的数据可以在不同的时间内使用共同的内存单元。尽管这些在内存中占的字节数不同,但都从同的内存单元。尽管这些在内存中占的字节数不同,但都从同一起始地址开始存放。而且是在不同的时间内去使用该内同一起始地址开始存放。而且是在不同的时间内去使用该内存单元。存单元。 共用体实际上是共用体实际上是C语言提供的一种覆盖技术。语言提供的一种覆盖技术。10.3 共共 用用

40、体体 char sexshort num float score 共用体的定义、使用形式同结构体相似。共用体的定义、使用形式同结构体相似。 union 共用体名共用体名 类型名类型名1 共用体成员名表共用体成员名表1; 类型名类型名2 共用体成员名表共用体成员名表2; 类型名类型名n 共用体成员名表共用体成员名表n;;1. 共用体类型的定义共用体类型的定义 union student int num; char sex; float score; union student stu1,stu2; typedef union int num; char sex; float score; UN;

41、 UN s1,s2; union int num; char sex; float score; stu1,stu2; union student int num; char sex; float score; stu1,stu2;2. 共用体变量的定义共用体变量的定义3. 共用体变量的引用方式共用体变量的引用方式共共用用体体的的使使用用也也与与结结构构体体相相同同,用用&取取共共用用体体的的地地址址,用用“. ” 或或“-”访问共用体成员。例如:访问共用体成员。例如: stu1.num(引用共用体变量中的整型变量(引用共用体变量中的整型变量num) stu1.sex (引用共用体变量中的字符

42、变量(引用共用体变量中的字符变量sex) stu1.score(引用共用体变量中的实型变量(引用共用体变量中的实型变量score) 1、同一个内存段可以用来存放几种不同类型的成员,但在、同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种。每一瞬时只能存放其中一种。 2、共用体变量中起作用的成员是最后一次存放的成员,在、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。如有以下赋值存入一个新的成员后原有的成员就失去作用。如有以下赋值语句:语句: stu1.num=101; stu1.sex=F; stu1.score=89.5;在完成以

43、上三个赋值运算以后,只有在完成以上三个赋值运算以后,只有stu1.score是有效的,是有效的,stu1.num和和stu1.sex已经无意义了。已经无意义了。共共共共 用用用用 体体体体 使使使使 用用用用 说说说说 明明明明3、共用体变量的地址和它的各成员的地址都是同一地址、共用体变量的地址和它的各成员的地址都是同一地址4、不能对共用体变量名赋值,也不能企图引用变量名来得到成、不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,也不能在定义共用体变量时对它初始化。员的值,也不能在定义共用体变量时对它初始化。5、不能把共用体变量作为函数参数,也不能使函数带回共用体、不能把共用体变量作

44、为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体变量这种变量,但可以使用指向共用体变量的指针(与结构体变量这种用法相仿)。用法相仿)。6、共用体类型可以出现在结构体类型定义中,也可以定义共用、共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。也可以作为共用体的成员。例如例如: struct date int day; int month; int year; union int sh1; float sh2;sh; a;举举举举

45、例例例例例例 10.13 分析下列程序的运行结果分析下列程序的运行结果 main() union char c2; int k;r; r.c0=2; r.c1=0; r.k=20; printf(%d,%d,%dn,r.k,r.c0,r.c1);20,20,0【例例10.14】分析下列程序的输出结果分析下列程序的输出结果 union as int a; int b; s3,*p;main() int n=1,k; for(k=0;ka,+p-a);3,3+p-a, p-a);3,2+p-a, +p-a);4,3共用体共用体与结构体的区别与结构体的区别struct exam int a ; fl

46、oat b ; char c ; x ;xabcunion exam int a ; float b ; char c ; x ;xb ac 结构变量的每个成员有独立的内存单元,结构变量的每个成员有独立的内存单元,而共用体变量的成员而共用体变量的成员以最大的成员开辟单元以最大的成员开辟单元后,所有成员共用该单元。后,所有成员共用该单元。sizeof (struct exam)10.4 枚枚 举举 类类 型型枚枚举类型的型的定义定义格式格式:enum 枚举类型标识符 枚举元素表列;例如:例如:enum daysun,mon,tue,wed,thu,fri,sat; 以上定义了一个枚举类型enum

47、 day,有个枚举元素。可以用此类型来定义变量。enum day workday; workday被定义为枚举变量,它的值只能是sun到sat之一。可以用通常给变量赋值的方法给枚举变量赋值。 例如:workday=mon;当然,也可以直接定义枚举变量,如:enum sun,mon,tue,wed,thu,fri,satworkday;说说 明明(1)对枚举类型的定义和枚举变量的使用,其实质是C编译系统将枚举元素按次序用0,1,等整数来代替,故称枚举元素为枚举常量,它们不是变量,所以不能被赋值。例如: printf(%1d,%1d,%1dn,sun,mon,tue); 屏幕将显示为:0,1,2,

48、(2)枚举值可以用来作判断比较。如: if(workday=mon)枚举值的比较规则是:按其在定义时的顺序号比较。(3)虽然每个枚举元素有一个对应的整数值,但是不能将一个整数直接赋给一个枚举变量。如:workday=2;是不对的。它们属于不同的类型。但可以通过强制类型转换后进行赋值。如:workday=(enum weekday)2;它的含义是将顺序号为2的枚举元素赋给workday,则相当于:workday=tue;【例例8.15】 分析下列程序的运行结果。分析下列程序的运行结果。main( )main( ) enum daysun enum daysun,monmon,tuetue,wed

49、wed,thuthu,frifri,satsat;/*/*定定义枚枚举类型型 * */ / enum day today enum day today; /*/*定定义枚枚举类型型变量量today */today */ int n int n; printf(printf(input todays number(0-6):input todays number(0-6):) );scanf(scanf(%d%d,&n)&n); switch(n) switch(n) case 0:today=sun case 0:today=sun; breakbreak; case 1:today=monc

50、ase 1:today=mon; breakbreak; case 2:today=tuecase 2:today=tue; breakbreak; case 3:today=wedcase 3:today=wed; breakbreak; case 4:today=thucase 4:today=thu; breakbreak; case 5:today=fricase 5:today=fri; breakbreak; case 6:today=satcase 6:today=sat; breakbreak; /* /*给枚枚举变量量todaytoday赋值 * */ / printf( p

51、rintf(Today is Today is ) ); switch(today) switch(today) case sun:printf( case sun:printf(SundaynSundayn) ); breakbreak; case mon:printf(case mon:printf(MondaynMondayn) ); breakbreak; case tue:printf(case tue:printf(TuesdaynTuesdayn) ); breakbreak; case wed:printf(case wed:printf(WendesdaynWendesdayn) ); breakbreak; case thu:printf(case thu:printf(ThursdaynThursdayn) ); breakbreak; case fri:printf(case fri:printf(FridaynFridayn) ); breakbreak; case sat:printf(case sat:printf(SaturdaynSaturdayn) ); breakbreak; /* /* 根据枚根据枚举变量量todaytoday的的值输出相出相应信息信息* */ /

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号