当前位置:嗨网首页>书籍在线阅读

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;
     ...
};

假设 flitscar_data 类型的结构变量,如果 flits.status0 ,程序将使用 flits.ownerinfo. owncar.socsecurity ,如果 flits.status1 ,程序则使用 flits.ownerinfo.leasecompany.name