c++中,结构体(struct)和共用体(union)是比较相似的复合数据类型,这两个都是用来存储多种数据的,但是他们之间还是有很大差距的,一起来了解
【1】共用体
(1)共用体的概念
在 C 语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。
共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方式上。
定义一个共用体类型的一般形式为:
union 共用体名
{
成员表列;
};
例如:
union gy
{
int i; char c; float f;
};
这里定义了一个共用体类型 union gy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。
由于共用体中各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。
在这一点上共用体与结构体不同,结构体类型变量在存储时总是按各成员的数据长度之和占用内存空间。
例如,定义了一个结构体类型:
struct gy
{
int i;
char c;
float f;
};
则结构体类型 struct gy 的变量占用的内存大小为 2+1+4=7 个字节(不考虑字节对齐)。
在使用共用体类型变量的数据时要注意:在共用体类型变量中起作用的成员是最后一次存放的成员,
在存入一个新的成员后原有的成员就失去作用。如有以下赋值语句:
a.i = 1;
a.c = ’a’;
a.f = 1.5;
完成以上三个赋值运算以后,a.f 是有效的,a.i 和 a.c 已经无意义了。
在程序中经常使用结构体与共用体相互嵌套的形式。
即共用体类型的成员可以是结构体类型,或者结构体类型的成员是共用体类型。
例如,下列结构体类型 datas 的第三个成员是共用体类型:
struct datas
{
char *ps;
int type;
union
{
float fdata;
int idata;
char cdata;
}udata;
};
【2】typedef
(1)在 C 语言中,允许使用关键字 typedef 定义新的数据类型
其语法如下:
typedef
<已有数据类型>
<新数据类型>;
如:
typedef int INTEGER;
这里新定义了数据类型 INTEGER, 其等价于 int
INTEGER i; <==> int i;
(2) 在 C 语言中经常在定义结构体类型时使用 typedef,例如
typedef
{
struct _node_
int data;
struct _node_ *next;
} listnode, *linklist;
这里定义了两个新的数据类型 listnode 和 linklist。其中 listnode 等价于数据类型 struct _node_ 而 linklist 等价于 struct _node_ *
【3】