1、共用体的定义
通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:
union 共用体名{
成员列表
};
共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
2、共用体的用法
共用体也是一种自定义类型,可以通过它来创建变量,例如:
union data{
int n;
char ch;
double f;
};
共用体 data 中,成员 f 占用的内存最多,为 8 个字节,所以 data 类型的变量(也就是 a、b、c)也占用 8 个字节的内存。
为了访问共用体的成员,我们使用成员访问运算符(.)。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。您可以使用 union 关键字来定义共用体类型的变量。
在这里,我们可以看到共用体的n和f成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也data成员能够完好输出的原因。
3、typedef用法
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。
第一种用法为基本数据类型定义新的类型名
typedef unsigned __int64 size_t;
第二种用法为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
typedef struct tagPoint{
double x;
double y;
double z;
} Point,*Firstpoint;
在这里我们定义了两个新的数据类型 Point和Firstpoint。其中Point等价于数据类型struct tagPoint ,
而Firstpoint等价于struct tagPoint *。
后面用结构体时可以直接定义了 point ar;
定义为指针结构体变量格式如下: Firstpoint Arr;