33-使用联合
14.10.1 使用联合
下面是联合的一些用法:
fit.digit = 23; //把 23 存储在 fit,占2字节
fit.bigfl = 2.0; // 清除23,存储 2.0,占8字节
fit.letter = 'h'; // 清除2.0,存储h,占1字节
点运算符表示正在使用哪种数据类型。在联合中,一次只存储一个值。即使有足够的空间,也不能同时存储一个 char 类型值和一个 int 类型值。编写代码时要注意当前存储在联合中的数据类型。
和用指针访问结构使用 -> 运算符一样,用指针访问联合时也要使用 -> 运算符:
pu = &fit;
x = pu->digit; // 相当于 x = fit.digit
不要像下面的语句序列这样:
fit.letter = 'A';
flnum = 3.02*fit.bigfl; // 错误
以上语句序列是错误的,因为存储在 fit 中的是 char 类型,但是下一行却假定 fit 中的内容是 double 类型。
不过,用一个成员把值存储在一个联合中,然后用另一个成员查看内容,这种做法有时很有用。下一章的程序清单15.4就给出了一个这样的例子。
联合的另一种用法是,在结构中存储与其成员有从属关系的信息。例如,假设用一个结构表示一辆汽车。如果汽车属于驾驶者,就要用一个结构成员来描述这个所有者。如果汽车被租赁,那么需要一个成员来描述其租赁公司。可以用下面的代码来完成:
struct owner {
char socsecurity[12];
...
};
struct leasecompany {
char name[40];
char headquarters[40];
...
};
union data {
struct owner owncar;
struct leasecompany leasecar;
};
struct car_data {
char make[15];
int status; /* 私有为0,租赁为1 */
union data ownerinfo;
...
};
假设 flits 是 car_data 类型的结构变量,如果 flits.status 为 0 ,程序将使用 flits.ownerinfo. owncar.socsecurity ,如果 flits.status 为 1 ,程序则使用 flits.ownerinfo.leasecompany.name 。