结构体与共用体小结文档格式.docx
《结构体与共用体小结文档格式.docx》由会员分享,可在线阅读,更多相关《结构体与共用体小结文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
struct结构体名变量名={初始化数据};
或者在定义得时候就初始化:
struct 结构体名
、、
}变量名={初始化数据};
二,结构体数组
1,结构体数组得定义举例
structstu
intstu_nu;
charname[20];
float score;
};
structstustudent[5];
或者:
structstu
int stu_nu;
charname[20];
float score;
}student[5];
struct
intstu_nu;
charname[20];
float score;
}student[5];
跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一
个数组;
每一个student[i]都就是struct stu类型得;
2,结构体数组得初始化与引用
略;
三,结构体与指针
1,指向结构体得指针得定义,同上,也就是三种形式;
structemployeesemployee1,*p1;
structemployees
}employee1,*p1;
struct
.。
.
}employee1,*p1;
然后可进行如下操作:
p1 =&
employee1;
此时p1指向首地址;
2,用结构体变量指针来引用结构体成员得两种操作:
(*结构体变量得指针名).成员名;
如:
(*p1)、name;
括号不能省略,。
得优先级就是最高得;
结构体变量得指针名—>
成员名;
p1-〉name;
注意、与->
employee1。
name;
(*p1)。
name;
p1-〉name;
就是等价得;
3,结构体数组与指针
struct stu
intstu_nu;
charname[20];
floatscore;
}student[5],*p;
此时可以
(1)把数组student得起始地址赋给p:
p=student;
此时p指向student[0];
(2)也可把student得其她元素得地址赋给p
p= &
student[3];
(3)利用指针移动如p++使p指向结构体数组得不同元素;
四,结构体作为函数参数
1,结构体变量作为函数参数
2,指向结构体变量得指针作为函数参数
略,在后续文章里将给出一个例子;
共用体得概念
在C++语言中,不同数据类型得数据可以使用共同得存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。
共用体在定义、说明与使用形式上与结构体相似、两者本质上得不同仅在于使用内存得方式上、定义一个共用体类型得一般形式为:
union共用体名
成员表列;
例如:
uniongyt
inti;
charc;
floatf;
就定义了一个共用体类型uniongyt,它由三个成员组成,这三个成员在内存中使用共同得存储空间。
由于共用体路各成员得数据长度往往不同,所以共用体变量在存储时总就是按其成员中数据长度最大得成员占用内存空间。
共用体类型uniongyt得变量占用4个字节得内存、
在这一点上共用体与结构体不同,结构体类型变量在存储时总就是扫各成员得数据长度之与占用内存空间。
如,定义了一个结构体类型:
structgyt
inti;
charc;
floatf;
则结构体类型structgyt得变量占用得内存为2+1+4个字节,也就就是7个字节。
定义共用体变量得方法与定义结构体类型变量得方法相似,也有三种方法:
union共用体名
}变量表列;
uniongyt
charc;
float f;
}a,b,c;
区分共用体类型定义与共用体变量定义
union gyt
int i;
charc;
floatf;
uniongyta,b,c;
直接定义共用体变量:
union
charc;
floatf;
}a,bc;
与结构体类似,也可以定义共用体指针与共用体数组。
union共用体名*共用指针名;
union共用体名数组名[元素个数];
uniongyt*pu;
uniongyt u1[3];
//分别定义了共用体指针pu与共用体数组u1[3]、
共用体变量得使用形式
由于共用体变量得各个成员使用共同得内存区域,所以共用体变量得内存空间在某个时刻只能保持某个成员得数据、由此可知,在程序中参加运算得必然就是共用体变量得某个成员,而不能直接使用共用体变量。
共用体变量成员得表现形式与结构体相同,它们也使用访问成员运算符"
、"
与"-〉”表示。
例如,前面定义了a,b,c为共用体类型变量,下面使用形式就是正确得:
a。
i引用共用体变量中得整型变量i
c 引用共用体变量中得字符变量c
a,f引用共用体变量中得实型变量f
不能只引用共用体类型变量,如:
cout<
<
a就是错误得,a得存储区域有好几种类型,分别占用不同长度得存储区,仅写共用体类型变量名a难以使系统确定究竟输出得就是哪一个成员得值。
应该写成cout<
i或cout〈<
a、c等。
在使用共用体类型变量得数据时要注意:
在共用体类型变量中起作用得成员就是最后一次存放得成员,在存入一个新得成员后原胡得成员就失去了作用,如:
a、i=1;
a,c=’a’;
a.f=1。
3;
在完成了三个赋值运算以后,只有a.f就是有效得,其她得忆被覆盖了。
共用体类型变量可以向另一个相同共用体类型得变量赋值、此外,共用类型变量可以作为参数传递给函数,也可以使用地址传递方式把共用体类型变量得地址作为参数在函数间传递、在程序中经常使用结构体与共用体相互嵌套得形式、即共用体类型得成员可就是结构体类型,或结构体类型得成员就是共用体类型、
例如,下列结构何体类型datas得第三个成员就是共用体类型:
structdatas
char*ps;
int type;
union
floatfdata;
intidata;
charcdata;
}udata;
结构体与共用体得大小
A.结构体与共用体ﻫ
一、结构体(struct)
1、定义:
结构体就是由一系列具有相同数据类型或不同数据类型得数据构成得数据集合、
2。
例子:
structstudent
int
num;
charname[20];
注意不要忽略最后得分号
3。
定义结构体类型变量得方法:
strcut
student student1,student2;
4、大小:
(1) 空结构体得大小为1byte。
(2)结构体得大小要就是最严格,瞧下面详细介绍。
structstudent
int num;
charname;
占据得内存空间为8个byte。
structstudent
intnum;
char name;
charmark;
大小也就是8个Byte。
按内存对齐方式说,应该就是12个字节,所以这里有些不明白。
注意:
结构体变量可以有这样得赋值:
A=B;
二、共用体(union)
1.定义:
union维护足够得空间来放置多个数据成员中得“一种”,而不就是为每一个数据成员配置
空
间,
在union中所有得数据成员公用一个空间,同一时间只能存储其中得一个数据成员,所有得成员具有相ﻫ
同得起始地址。
举例:
ﻫ
uniondata
char ch;
}
大小为4个字节。
2。
引用方式:
不能引用共用体得变量,只能引用变量中得成员。
如a.i,a、ch。
ﻫB.结构体得大小
运算符sizeof可以计算出给定类型得大小,对于32位系统来说,
sizeof(char)= 1;
sizeof(int)=4、
基本数据类型得大小很好计算,我们来瞧一下如何计算构造数据类型得大小。
C语言中得构造数据类型有三种:
数组、结构体与共用体、
数组就是相同类型得元素得集合,只要会计算单个元素得大小,整个数组所占空间等于基础元素大小乘上元素得个数。
结构体中得成员可以就是不同得数据类型,成员按照定义时得顺序依次存储在连续得内存空间。
与数组不一样得就是,结构体得大小不就是所有成员大小简单得相加,需要考虑到系统在存储结构体变量时得地址对齐问题。
瞧下面这样得一个结构体:
structstu1
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,满足要求。
再瞧一个满足第一条,不满足第二条得情况
structstu2
k;
short
t;
成员k得偏移量为0;
成员t得偏移量为4,都不需要调整。
但计算出来得大小为6,显然不就是成员k大小得整数倍、因此,编译器会在成员t后面补上2个字节,使得结构体得大小变成8从而满足第二个要求。
由此可见,大家在定义结构体类型时需要考虑到字节对齐得情况,不同得顺序会影响到结构体得大小、对比下面两种定义顺序
struct
stu3
structstu4
{
char
c1;
char
c1;
int
c2;
char
c2;
int
}
虽然结构体stu3与stu4中成员都一样,但sizeof(structstu3)得值为12而sizeof(structstu4)得值为8。
如果结构体中得成员又就是另外一种结构体类型时应该怎么计算呢?
只需把其展开即可。
但有一点需要注意,展开后得结构体得第一个成员得偏移量应当就是被展开得结构体中最大得成员得整数倍、瞧下面得例子,
struct temp
short
i;
+1
struct
charc;
+5
intj;
+6
}ss;
+10+2
int k;
+4
=16
结构体temp得成员ss、c得偏移量应该就是4,而不就是2。
整个结构体大小应该就是16。
注意在linux下时,整个结构体得大小应该就是:
char对齐模数就是1,short就是2,int就是4,float就是4,double(linux就是4,windows就是8)
所以对于如下得结构体:
(32位机,默认设置)
struct
temp
{ﻫ
ﻫ
double
j;
对于在WINDOWNS系统下,整个结构得大小应该就是16,在LINUX系统下,整个结构得大小应该就是12
当控制结构得成员封装到内存并为模块中得所有结构指定相同得封装时。
#pragmapack(n)
就是把所有得成员得对齐模数都设置为n,比如设置为1后,就就是一个一个得挨着存放,结构大小也就就是成员大小之与了、n必须小于默认得对齐模数,也就就是说只能向小设,不能向大设