




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
构造数据类型,也叫共用体
用途:使几个不同类型的变量共占一段内存(相互覆盖)1、联合体类型的定义
union[联合体类型名]{
数据类型名1成员名1;数据类型名2成员名2;
……
数据类型名n成员名n;};类型定义不分配内存chif2000200120022003共占4字节sizeof(unionUData)=sizeof(f)
联合体的大小是成员中占内存最大的成员的大小
unionUData{shorti;charch;floatf;};chif20002001200220032004200520062007共占7字节structSData{shorti;charch;floatf;};联合体
联合体变量的定义形式一:uniondata{shorti;charch;floatf;}a,b;形式二:uniondata{shorti;charch;floatf;};uniondataa,b,*p,d[3];形式三:union{shorti;charch;floatf;}a,b,c;fchifchiab共用体变量任何时刻只有一个成员存在共用体变量定义分配内存,长度=最长成员所占字节数联合体变量的定义联合体变量名.成员名联合体指针名->成员名
或
(*联合体指针名).成员名
uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f联合体变量的引用
联合体变量的初始化赋值
定义联合体变量时可以对变量赋初值,但只能对变量的第一个成员赋初值,不可象结构体变量那样对所有的成员赋初值。unionUData{shorti;charch;floatf;};unionUDatadata={10};//10赋给成员iunionUDatadata={'A'};//'A'赋给成员i,即i的值为65('A'的ASCII码)unionUDatadata={10,'A',12.5};//错误,{}中只能有一个值unionUDatadata=10;//错误,初值必须用{}括起来联合体变量的赋值
联合体变量在程序中赋值
定义了联合体变量以后,如果要对其赋值,则只能通过对其成员赋值,不可对其整体赋值。
具有相同联合体类型的变量之间也可以相互赋值。
unionUData{shorti;charch;floatf;};unionUDatadata,*p,d[10];data={10};//错误data=10;//错误data.i=10;//正确,将10赋给data的成员ip=&data;//p指向datap->f=12.5;//正确,将12.5赋给data的成员fd[0].ch='A'//正确,将'A'赋给d[0]的成员chunionUDatadata1={10},data2;data2=data1;//正确联合体变量的赋值
由于联合体变量的各成员共享同一地址的内存单元,所以在对其成员赋值的某一时刻,存放的和起作用的将是最后一次存入的成员值
对联合体变量的某个成员赋值时,也改变了其它成员的值,因为它们共享一个内存地址。
由于联合体变量所有成员共享同一内存空间,因此联合体变量与其各成员的地址相同。
unionUDatadata;data.i=10;data.ch='A';data.f=12.5;则data.f的值才是有效的成员的值。unionUDatadata;data.i=10;data.ch='A';则data的成员i的值将变为65(‘A’的ASCII码值)。unionUDatadata;则&data与&data.i、&data.ch、&data.f均相同几点说明【例1】共用体成员间的相互影响。#include<stdio.h>voidmain(){
union{longL;shorta;charch;}
d={0xFFF11241};printf("d.ch=%cd.a=%Xd.L=%X\n",d.ch,d.a,d.L);d.a++;printf("d.ch=%cd.a=%Xd.L=%X\n",d.ch,d.a,d.L);}chaL20002001200220030XFF0XF10X120X41运行结果:d.ch=Ad.a=1241d.L=FFF11241d.ch=Bd.a=1242d.L=FFF112420X42【例2】设有一个教师与学生通用的表格,教师数据有姓名、年龄、职业,教研室四项。学生有姓名、年龄、职业、班级四项。编程输入人员数据,再以表格输出。
#include<stdio.h>structStu_Tea{charname[10];//姓名
intage;//年龄
charjob;//工作s--表示学生,t--表示教师
union{intclassno;//学生班级号
charoffice[10];//教师教研室名
}depart;};voidmain(){structStu_Teabody[2];inti;for(i=0;i<2;i++)//输入学生或教师信息
{printf("inputname,age,jobanddepartment\n");scanf("%s%d%c",body[i].name,&body[i].age,&body[i].job);if(body[i].job=='s')//是学生,输入班级号
scanf("%d",&body[i].depart.classno);else//是教师,输入教研室名
scanf("%s",body[i].depart.office);}//显示输入的学生、教师信息
printf("name\tagejobclass/office\n");for(i=0;i<2;i++){if(body[i].job=='s')printf("%s\t%3d%3c%d\n",body[i].name,body[i].age,body[i].job,body[i].depart.classno);elseprintf("%s\t%3d%3c%s\n",body[i].name,body[i].age,body[i].job,body[i].depart.office);}}
对结构体或联合体中的成员访问:只能是该成员所对应的整个内存单元
如果要访问结构体或联合体中的成员所对应内存单元的若干位,则必须要将结构体或联合体中的成员定义成位域成员。
位域成员:只占有有限几位的结构体或联合体成员。位域成员是特殊的成员,它必须是整型或字符型变量(char、short、int),但它可以只占有一个整型数据的某几位。
定义位域成员的方法:在定义结构体或联合体类型时,只要在成员后面加上“:位数”,
位域1514131211109876543210dcba1514131211109876543210dcastructBitStruct{chara:4;shortb:4;unsignedlongc:7;shortd:1;}word;structBitStruct{chara:4;
short:4;unsignedlongc:7;shortd:1;}word;匿名位域
对位域成员的引用方法与结构体或联合体成员引用方法一样,用“.”或“->”来引用这些成员。
注意:不能对位域成员取地址。例如:&word.a是错误的。【例】位域的应用。
#include<stdio.h>structMyStruct{unsignedchara:1;unsignedcharb:5;unsignedshortc:10;};unionMyUnion{unsignedshortx;structMyStructy;};voidmain(){unionMyUnionm={(unsignedshort)0XFFF1};printf("m.y.a=%u\n",m.y.a);printf("m.y.b=%u\n",m.y.b);printf("m.y.c=%u\n",m.y.c);m.y.b=0;printf("%X\n",m.x);}运行结果(BC或TC下):m.y.a=1m.y.b=24m.y.c=1023m.x=FFC115141312111098765432101111111111110001c(VC下不可取)ba运行结果(VC下):m.y.a=1m.y.b=24m.y.c=0m.x=FFC100000注意:
在VC下,利用y.c不可读取x的高10位数据,如果对y.c的作了改变,也不会影响x的值,就好象y.c与x无关一样。为了避免在不同编译环境下程序运行结果的不一致性,一般将位域成员的数据类型定义为同一数据类型。例如,将程序中的a和b的数据类型如果改为unsignedshort,则程序在VC下运行的结果与BC或TC下都是相同的。
如果一个变量只有几种可能的值,可以把它定义成枚举类型。所谓“枚举”,顾名思义,就是把这种类型数据可取的值一一列举出来。一个枚举型变量取值仅限于列出值的范围。枚举数据类型通常的定义形式为:enum
枚举类型名{
枚举元素表};由多个标识符组成,标识符之间用逗号分开定义枚举类型:enumweekday{sun,mon,tue,wed,thu,fri,sat};定义枚举类型变量:enumweekday
today,nextday;enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;取值枚举类型变量的定义和引用enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;today=sun;nextday=mon;if(today==sat)nextday=sun;today=100;
√×C编译对枚举元素实际上按整型常量处理,当遇到枚举元素列表时,编译程序就把其中第一个标识符赋0值,第二、三、…个标识符依此赋1,2,…。enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;0123456today=sun;printf("today=%d",today);运行结果:today=0
if(today==6)nextday=0;if(today==sat)nextday=sun;可以在枚举类型定义时指定枚举元素的值
enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};7123456注意:枚举元素是常量,在程序中不可对它赋值。例如:sun=0;mon=1;将产生错误。定义枚举类型的好处:
用标识符表示数值增加了程序的可读性清晰不清晰
可限制了变量的取值范围如today只能取sun~sat中的值【例1】荷兰国旗问题。这是荷兰人dijkstra提出的问题,荷兰国旗由红白蓝三色组成,现有N个桶,每个桶
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论