当前位置:文档之家› 结构体与共用体小结

结构体与共用体小结

结构体与共用体小结一,结构体得概念与定义1,结构体得定义struct 结构体名{数据类型成员名1;数据类型成员名1;、、、};这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套;2,结构体变量得定义struct 结构体名变量名1,变量名2,,,变量名n;或:struct 结构体名{数据类型成员名1;数据类型成员名1;、、、}结构体变量1,结构体变量2;或:struct{数据类型成员名1;数据类型成员名1;、、、}结构体变量1,结构体变量2;三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码;其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样;3,结构体变量得引用只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出;嵌套得结构体类型得引用:结构体变量名、结构体类型成员名、内嵌结构体得成员名;4,结构体变量得初始化struct 结构体名变量名= {初始化数据};或者在定义得时候就初始化: struct 结构体名{数据类型成员名1;数据类型成员名1;、、、}变量名= {初始化数据};二,结构体数组1,结构体数组得定义举例struct stu{int stu_nu;char name[20];float score;};struct stu student[5];或者:struct stu{int stu_nu;char name[20];float score;}student[5];或者:struct{int stu_nu;char name[20];float score;}student[5];跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得;2,结构体数组得初始化与引用略;三,结构体与指针1,指向结构体得指针得定义,同上,也就是三种形式;struct employees employee1,*p1;或者:struct employees、、、}employee1,*p1;或者:struct{、、、}employee1,*p1;然后可进行如下操作:p1 = &employee1;此时p1指向首地址;2,用结构体变量指针来引用结构体成员得两种操作:(*结构体变量得指针名)、成员名;如:(*p1)、name;括号不能省略,、得优先级就是最高得;或:结构体变量得指针名>成员名;如:p1>name;注意、与>得优先级就是最高得;employee1、name;(*p1)、name;p1>name;就是等价得;3,结构体数组与指针struct stu{int stu_nu;char name[20];float score;}student[5],*p;此时可以(1)把数组student得起始地址赋给p:p = student;此时p指向student[0];(2)也可把student得其她元素得地址赋给pp = &student[3];(3)利用指针移动如p++使p指向结构体数组得不同元素;四,结构体作为函数参数1,结构体变量作为函数参数2,指向结构体变量得指针作为函数参数略,在后续文章里将给出一个例子;共用体得概念在C++语言中,不同数据类型得数据可以使用共同得存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。

共用体在定义、说明与使用形式上与结构体相似。

两者本质上得不同仅在于使用内存得方式上。

定义一个共用体类型得一般形式为:union 共用体名{成员表列;};例如:union gyt{int i;char c;float f;};就定义了一个共用体类型union gyt,它由三个成员组成,这三个成员在内存中使用共同得存储空间。

由于共用体路各成员得数据长度往往不同,所以共用体变量在存储时总就是按其成员中数据长度最大得成员占用内存空间。

如:共用体类型union gyt得变量占用4个字节得内存。

在这一点上共用体与结构体不同,结构体类型变量在存储时总就是扫各成员得数据长度之与占用内存空间。

如,定义了一个结构体类型:struct gyt{int i;float f;};则结构体类型struct gyt得变量占用得内存为2+1+4个字节,也就就是7个字节。

定义共用体变量得方法与定义结构体类型变量得方法相似,也有三种方法:union 共用体名{成员表列;}变量表列;如:union gyt{int i;char c;float f;}a,b,c;区分共用体类型定义与共用体变量定义union gyt{int i;char c;};union gyt a,b,c;直接定义共用体变量:union{int i;char c;float f;}a,bc;与结构体类似,也可以定义共用体指针与共用体数组。

union 共用体名*共用指针名;union 共用体名数组名[元素个数];例如:union gyt *pu;union gyt u1[3]; //分别定义了共用体指针pu与共用体数组u1[3]。

共用体变量得使用形式由于共用体变量得各个成员使用共同得内存区域,所以共用体变量得内存空间在某个时刻只能保持某个成员得数据。

由此可知,在程序中参加运算得必然就是共用体变量得某个成员,而不能直接使用共用体变量。

共用体变量成员得表现形式与结构体相同,它们也使用访问成员运算符"、"与">"表示。

例如,前面定义了a,b,c为共用体类型变量,下面使用形式就是正确得:a、i 引用共用体变量中得整型变量ia、c 引用共用体变量中得字符变量ca,f 引用共用体变量中得实型变量f不能只引用共用体类型变量,如:cout<<a就是错误得,a得存储区域有好几种类型,分别占用不同长度得存储区,仅写共用体类型变量名a难以使系统确定究竟输出得就是哪一个成员得值。

应该写成cout<<a、i或cout<<a、c等。

在使用共用体类型变量得数据时要注意:在共用体类型变量中起作用得成员就是最后一次存放得成员,在存入一个新得成员后原胡得成员就失去了作用,如:a、i=1;a,c='a';a、f=1、3;在完成了三个赋值运算以后,只有a、f就是有效得,其她得忆被覆盖了。

共用体类型变量可以向另一个相同共用体类型得变量赋值。

此外,共用类型变量可以作为参数传递给函数,也可以使用地址传递方式把共用体类型变量得地址作为参数在函数间传递。

在程序中经常使用结构体与共用体相互嵌套得形式。

即共用体类型得成员可就是结构体类型,或结构体类型得成员就是共用体类型。

例如,下列结构何体类型datas得第三个成员就是共用体类型:struct datas{char *ps;int type;union{float fdata;int idata;char cdata;}udata;};结构体与共用体得大小A、结构体与共用体一、结构体(struct)1、定义:结构体就是由一系列具有相同数据类型或不同数据类型得数据构成得数据集合。

2、例子:struct student{int num;char name[20];};注意不要忽略最后得分号3、定义结构体类型变量得方法:strcut student student1, student2;4、大小:(1) 空结构体得大小为1byte、(2)结构体得大小要就是最严格,瞧下面详细介绍。

如:struct student{int num;char name;};占据得内存空间为8个byte。

struct student{int num;char name;char mark;};大小也就是8个Byte。

按内存对齐方式说,应该就是12个字节,所以这里有些不明白。

注意:结构体变量可以有这样得赋值:A=B;二、共用体(union)1、定义:union维护足够得空间来放置多个数据成员中得“一种”,而不就是为每一个数据成员配置空间,在union中所有得数据成员公用一个空间,同一时间只能存储其中得一个数据成员,所有得成员具有相同得起始地址。

举例:union data{int i;char ch;float f;}大小为4个字节。

2、引用方式:不能引用共用体得变量,只能引用变量中得成员。

如a、i, a、ch、B、结构体得大小运算符sizeof可以计算出给定类型得大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。

基本数据类型得大小很好计算,我们来瞧一下如何计算构造数据类型得大小。

C语言中得构造数据类型有三种:数组、结构体与共用体。

数组就是相同类型得元素得集合,只要会计算单个元素得大小,整个数组所占空间等于基础元素大小乘上元素得个数。

结构体中得成员可以就是不同得数据类型,成员按照定义时得顺序依次存储在连续得内存空间。

与数组不一样得就是,结构体得大小不就是所有成员大小简单得相加,需要考虑到系统在存储结构体变量时得地址对齐问题。

瞧下面这样得一个结构体:struct stu1{int i;char c;int j;};类型对齐方式(变量存放得起始地址相对于结构得起始地址得偏移量)??Char 偏移量必须为sizeof(char)即1得倍数??Short 偏移量必须为sizeof(short)即2得倍数??int ?? 偏移量必须为sizeof(int)即4得倍数??float ?? 偏移量必须为sizeof(float)即4得倍数??double ? 偏移量必须为sizeof(double)即8得倍数实际上,由于存储变量时地址对齐得要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员得偏移量必须就是成员大小得整数倍(0被认为就是任何数得整数倍)二、结构体大小必须就是所有成员大小得整数倍。

对照第一条,上面得例子中前两个成员得偏移量都满足要求,但第三个成员得偏移量为5,并不就是自身(int)大小得整数倍。

编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员得偏移量变成8。

对照第二条,结构体大小等于最后一个成员得偏移量加上其大小,上面得例子中计算出来得大小为12,满足要求。

再瞧一个满足第一条,不满足第二条得情况struct stu2{int k;short t;};成员k得偏移量为0;成员t得偏移量为4,都不需要调整。

但计算出来得大小为6,显然不就是成员k大小得整数倍。

因此,编译器会在成员t后面补上2个字节,使得结构体得大小变成8从而满足第二个要求。

由此可见,大家在定义结构体类型时需要考虑到字节对齐得情况,不同得顺序会影响到结构体得大小。

相关主题