结构的数据成员各自占用一块内存空间, 它们形成一个整体, 所占空间是全部成员所占空间的总和。联合与此不同, 它的数据成员重叠挤占同一段内存空间, 有点像"一套班子, 多块招牌", 它们形成的整体, 所占空间取成员中占用空间最大者。下图表示了结构和联合与区别:
struct A { |
| 结构A拥有2个成员: | |||||||||||||||
union B { |
| 联合B拥有2个成员: |
在程序设计中, 联合一般用于把同一段内存空间, 根据不同的情况存储不同类型的数据。下面以几何图形为例说明结构和联合的用法。
对于点, 需要保存该点的横坐标x和纵坐标y; 对于直线, 需要保存直线方程ax + by + c = 0的三个系数; 对于矩形, 需要保存两个点 —— 左上角p1和右下角p2的坐标; 对于圆, 需要保存圆心点center的坐标和半径radius等, 下面是点、线、矩形和圆的结构定义:
POINT结构表示点, 它有两个成员, 分别是点的横坐标x(实数)和纵坐标y(实数):
struct POINT { // 点(16字节) |
|
LINE结构表示直线, 它有三个成员, 分别是直线方程的三个系数(实数):
struct LINE { // 线(24字节) |
|
RECT结构表示矩形, 它有两个成员, 分别是左上角和右下角的点(POINT结构):
struct RECT { // 矩形(32字节) |
|
CIRCLE结构表示圆, 它有两个成员, 分别表示圆心点(POINT结构)和半径(实数):
struct CIRCLE { // 圆(24字节) |
|
对于一个几何图形, 它要么是点, 要么是直线, 要么是矩形, 要么是圆, ...。它不可能既是点, 又是线, 所以只需要用一套内存空间来表示即可。这里可以用联合来表示它:
union SHAPE { // 几何图形(32字节) |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
虽然从理论上说可以这么做, 但实际使用时却不方便, 因为我们并不清楚这个联合现在到底表示的是什么! 下面是改进的方案, 增设一个标记成员来识辨现在的图形到底是什么! 我们当然可以用编号来表示, 比如: 0 - 表示点, 1 - 表示直线, 2 - 表示矩形, 3 - 表示圆, ...。为了方便, 使用枚举来代替编码, 更直观:
enum SHAPE_TAG {point, line, rect, circle}; // 图形标识类(枚举) |
SHAPE_TAG是枚举类型名, 该类型可取的值有: point, line, rect, circle, 这四个单词分别表示整数0, 1, 2, 3, 用来表示图形类别编号。下面是几何图形的结构定义, 在结构中嵌套了一个无名的联合:
struct SHAPE { // 几何图形结构(36字节) |
|
在几何图形结构里, 有两个成员, 一个是图形标记(枚举, 4字节), 另一个是一个图形联合体(32字节), 它要么是点p(16字节), 要么是直线l(24字节), 要么是矩形r(32字节), 要么是圆c(24字节)。
没有评论:
发表评论