转自:http://www.cnblogs.com/brokencode/archive/2011/03/15/1984708.html
一,结构体的概念和定义
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的其他元素的地址赋给p
p = &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;
char c;
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;
float f;
};
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 引用共用体变量中的整型变量i
a.c 引用共用体变量中的字符变量c
a,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;
};