2008年12月19日星期五

结构和联合

结构的数据成员各自占用一块内存空间, 它们形成一个整体, 所占空间是全部成员所占空间的总和。联合与此不同, 它的数据成员重叠挤占同一段内存空间, 有点像"一套班子, 多块招牌", 它们形成的整体, 所占空间取成员中占用空间最大者。下图表示了结构和联合与区别:

struct A {
    int x;
    float y;
};

 
xy
    
    
 

结构A拥有2个成员:
    x: 4字节, 整数
    y: 4字节, 单精度实数
两个成员各自分配内存空间
整个结构占空间8字节

union B {
    int x;
    float y;
};

 
x
    
y
 

联合B拥有2个成员:
    x: 4字节, 整数
    y: 4字节, 单精度实数
两个成员挤占同一段内存空间
整个联合占空间4字节

在程序设计中, 联合一般用于把同一段内存空间, 根据不同的情况存储不同类型的数据。下面以几何图形为例说明结构和联合的用法。

对于点, 需要保存该点的横坐标x和纵坐标y; 对于直线, 需要保存直线方程ax + by + c = 0的三个系数; 对于矩形, 需要保存两个点 —— 左上角p1和右下角p2的坐标; 对于圆, 需要保存圆心点center的坐标和半径radius等, 下面是点、线、矩形和圆的结构定义:

POINT结构表示点, 它有两个成员, 分别是点的横坐标x(实数)和纵坐标y(实数):

struct POINT { // 点(16字节)
    double x, y; // 坐标: (x, y)
};

xy
        
        

LINE结构表示直线, 它有三个成员, 分别是直线方程的三个系数(实数):

struct LINE { // 线(24字节)
    double a, b, c; // 直线方程: ax + by + c = 0
};

abc
        
        
        

RECT结构表示矩形, 它有两个成员, 分别是左上角和右下角的点(POINT结构):

struct RECT { // 矩形(32字节)
    POINT p1, p2; // 两点: 左上角和右下角
};

p1p2
xy
        
        
xy
        
        

CIRCLE结构表示圆, 它有两个成员, 分别表示圆心点(POINT结构)和半径(实数):

struct CIRCLE { // 圆(24字节)
    POINT center; // 圆心
    double radius; // 半径
};

centerradius
xy
        
        
 
        

对于一个几何图形, 它要么是点, 要么是直线, 要么是矩形, 要么是圆, ...。它不可能既是点, 又是线, 所以只需要用一套内存空间来表示即可。这里可以用联合来表示它:

union SHAPE { // 几何图形(32字节)
    POINT p; // 点(16字节)
    LINE l; // 直线(24字节)
    RECT r; // 矩形(32字节)
    CIRCLE c; // 圆(24字节)
};

p(点) 
l(直线) 
r(矩形)
c(圆) 
        
        
        
        

虽然从理论上说可以这么做, 但实际使用时却不方便, 因为我们并不清楚这个联合现在到底表示的是什么! 下面是改进的方案, 增设一个标记成员来识辨现在的图形到底是什么! 我们当然可以用编号来表示, 比如: 0 - 表示点, 1 - 表示直线, 2 - 表示矩形, 3 - 表示圆, ...。为了方便, 使用枚举来代替编码, 更直观:

enum SHAPE_TAG {point, line, rect, circle}; // 图形标识类(枚举)

SHAPE_TAG是枚举类型名, 该类型可取的值有: point, line, rect, circle, 这四个单词分别表示整数0, 1, 2, 3, 用来表示图形类别编号。下面是几何图形的结构定义, 在结构中嵌套了一个无名的联合:

struct SHAPE { // 几何图形结构(36字节)
    SHAPE_TAG tag; // 图形标记(4字节);
    union { // 图形联合体(32字节)
        POINT p; // 点
        LINE l; // 直线
        RECT r; // 矩形
        CIRCLE c; // 圆
    };
};

tagp, l, r 或 c
    
        
        
        
        

在几何图形结构里, 有两个成员, 一个是图形标记(枚举, 4字节), 另一个是一个图形联合体(32字节), 它要么是点p(16字节), 要么是直线l(24字节), 要么是矩形r(32字节), 要么是圆c(24字节)。

转自:
http://blog.csdn.net/Horse_Lixiang/archive/2006/05/05/708735.aspx

没有评论:

我的简介