共用体和typedef声明
一、共用体
共用体是一种特殊的自定义类型:这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以也叫联合)
使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构
定义共用体类型变量的一般形式:
union 共用体名
{成员表列
}变量表列;
结构体变量所占内存长度是各成员占的内存长度之和。
每个成员分别占有其自己的内存单元。
共用体变量所占的内存长度等于最长的成员的长度。
1.引用共用体变量的方式
只有先定义了共用体变量才能引用它。
不能引用共用体变量,而只能引用共用体变量中的成员。
例如:
a.j(引用共用体变量中的整型变量i)
a.ch(引用共用体变量中的字符变量ch)
a.f(引用共用体变量中的实型变量f)
a的存储区可以按不同的类型存放数据,有不同的长度,仅写共用体变量名a,系统无法知道究竟应输出哪一个成员的值。
应写成:
printf(“%d”,a.i);或者printf(“%c”,a.ch);
2.共用体类型数据的特点
- 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一个成员,而不是同时存放几个。
在每一个瞬时,存储单元只能有唯一的内容。
在共用体变量中只能存放一个值
- 可以对共用体变量初始化,但初始化表中只能有一个常量。
- 共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。
到共用的存储单元去读数据,将存储单元中的内容按存储字符数据的规则解释
在引用共用体变量时应十分注意当前存放在共用体变量中的究竟是哪个成员的值
- 共用体变量的地址和他的各成员的地址都是同一地址。
例如:&a.i, &a.c, &a.f都是同一值
- 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
- 可以使用指向共用体变量的指针作函数参数。
- 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。
结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员
例如:
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
结果:
8
16
二、typedef声明新类型名
可以用typedef指定新的类型名来代替已有的类型名
- 简单地用一个新的类型名代替原有的类型名
例如:
typedef int Integer;——指定用Integer为类型名,作用与int相同
typedef float Real;——指定用Real为类型名,作用与float相同
- 命名一个简单的类型名代替复杂的类型表示方法
- 命名一个新的类型名代表结构体类型:
typedef struct
{ int month;
int day;
int year;
}Date;
以上声明了一个新类型名Date,代表上面的一个结构体类型。然后可以用新的类型名Date去定义变量。- 命名一个新的类型名代表数组类型
- 命名一个新的类型名代表指针类型
- 命名一个新的类型名代表指向函数的指针类型
声明一个新的类型名的方法是:
- 先按定义变量的方法写出定义体
- 将变量名换成新类型名
- 在最前面加typedef
- 然后可以用新类型名去定义变量
- 以上的方法实际上是为特定的类型指定了一个同义字
- 用typedef只是对已经存在的类型指定一个新的类型名,是对int型另给一个新名字
- 用typedef声明数组类型、指针类型,结构体类型、共用体类型、枚举类型
- typedef是在编译阶段处理的,#define是在预编译时处理的,他只能做简单的字符串替换
- 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型。可以把所有的typedef名称声明单独放在一个头文件中,然后再需要用到他们的文件中用#include指令把它们包含到文件中
- 使用typedef名称有利于程序的通用与移植