【转】联合体介绍

    技术2025-09-12  121

    参考:

    http://blog.sina.com.cn/s/blog_40e9d4dd0100e6oz.html

    http://blog.sina.com.cn/s/blog_40e9d4dd0100e6p2.html

     

    “联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。如前面介绍的“单位”变量, 如定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符串(教研室)。要么赋予整型值,要么赋予字符串,不能把两者同时赋予它。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后, 才能把变量说明为该联合类型。一、联合的定义定义一个联合类型的一般形式为:  union 联合名  {  成员表  };成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 成员名的命名应符合标识符的规定。例如:  union perdata{    int class;    char office;};  定义了一个名为perdata的联合类型,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。联合定义之后,即可进行联合变量说明,被说明为perdata类型的变量,可以存放整型量class或存放字符数组office。二、联合变量的说明  联合变量的说明和结构变量的说明方式相同, 也有三种形式。即先定义,再说明;定义同时说明和直接说明。以perdata类型为例,说明如下:  union perdata{    int class;    char officae;};union perdata a,b;或者可同时说明为:  union perdata{  int class;char office;  }a,b;或直接说明为:  union{  int class;char office;  }a,b  经说明后的a,b变量均为perdata类型。 它们的内存分配示意图如图7—8所示。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。从图中可见,a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。

    三:联合变量的使用

    联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用"->;"符号, 此时联合访问成员可表示成:

    联合名->;成员名

    另外, 联合既可以出现在结构内, 它的成员也可以是结构。

    例如:

    struct{

    int age;

    char *addr;

    union{

    int i;

    char *ch;

    }x;

    }y[10];

    若要访问结构变量y[1]中联合x的成员i, 可以写成:

    y[1].x.i;

    若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:

    *y[2].x.ch;

    若写成"y[2].x.*ch;"是错误的。

    最新回复(0)