C语言之联合和枚举

一、联合说明和联合变量定义

联合也是一种新的数据类型, 它是一种特殊形式的变量。
联合说明和联合变量定义与结构十分相似。其形式为:

union 联合名
{ 
    数据类型 成员名; 
    数据类型 成员名; 
    ... 
}联合变量名;


联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
下例表示说明一个联合a_bc:

union a_bc
{ 
    int i; 
    char mm; 
};

再用已说明的联合可定义联合变量。
例如用上面说明的联合定义一个名为lgc的联合变量,可写成:

union a_bc lgc; 

在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
当一个联合被说明时, 编译程序自动地产生一个变量,其长度为联合中最大的变量长度。
联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时,也要用->符号, 此时联合访问成员可表示成:

联合名->成员名 

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

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;是错误的。

二、结构和联合的区别

1. 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员, 而结构的所有成员都存在。
2. 对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值互不影响的。

下面举一个例了来加深对联合的理解。

main() 
{ 
    union
    { /*定义一个联合*/ 
        int i; 
        struct
        { /*在联合中定义一个结构*/ 
        char first; 
        char second; 
        }half; 
    }number; 
    number.i=0x4241; /*联合成员赋值*/ 
    printf("%c%c\n", number.half.first, mumber.half.second); 
    number.half.first='a'; /*联合中结构成员赋值*/ 
    number.half.second='b'; 
    printf("%x\n", number.i); 
    getch(); 
} 



输出结果为: 
AB 
6261 

从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后,这两个字符的ASCII码也将作为i 的低八位和高八位。
简单的说,就是联合里面的所有变量共用一个内存区域,区域大小是所有变量中最大的那个。改动某一个变量的值,其他的值也会随之改变。

三、枚举(enum)

枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。
例如表示星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,就是一个枚举。
枚举的说明与结构和联合相似, 其形式为:

enum 枚举名
{ 
    标识符[=整型常数], 
    标识符[=整型常数], 
    ... 
    标识符[=整型常数], 
}枚举变量;

如果枚举没有初始化,即省掉=整型常数时,则从第一个标识符开始,顺次赋给标识符0,1,2, ...。但当枚举中的某个成员赋值后, 其后的成员按依次加1的规则确定其值。
例如下列枚举说明后,x1, x2, x3, x4的值分别为0, 1, 2, 3。

enum string{x1, x2, x3, x4}x; 

当定义改变成:

enum string 
{ 
    x1, 
    x2=0, 
    x3=50, 
    x4, 
}x;

则x1=0, x2=0, x3=50, x4=51
注意:

1. 枚举中每个成员(标识符)结束符是,, 不是;, 最后一个成员可省略,。 
2. 初始化时可以赋负数, 以后的标识符仍依次加1。
3. 枚举变量只能取枚举说明结构中的某个标识符常量。

例如:

enum string 
{ 
    x1=5, 
    x2, 
    x3, 
    x4, 
}; 
enum strig x=x3;

此时, 枚举变量x实际上是7。
下面看一个例子:

main()
{
    enum colors {red=1,green,blue}col;
    int cl;
    printf("1=red,2=green,3=blue. seclect:");
    scanf("%d",&cl);
    col=(enum colors) cl; /*强制转换*/
    switch(col)
    {
    case red:
        printf("red\n");
        break;
    case green:
        printf("green\n");
        break;
    case blue:
        printf("blue\n");
        break;
    defalut:
        break;
    }
}

四、类型说明符

类型说明的格式为:

typedef 类型 定义名; 

类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型这里类型是Turbo C许可的任何一种数据类型定义名表示这个类型的新名字。
例如: 用下面语句定义整型数的新名字:

typedef int SIGNED_INT; 

使用说明后, SIGNED_INT就成为int的同义词了,此时可以用SIGNED_INT定义整型变量。
例如:

 SIGNED_INT i, j;    //(与int i, j等效)。 

long SIGNED_INT i, j;     //是非法的。 

typedef同样可用来说明结构、联合以及枚举。
说明一个结构的格式为:

typedef struct
{ 
    数据类型 成员名; 
    数据类型 成员名; 
    ... 
} 结构名;

此时可直接用结构名定义结构变量了。例如:

typedef struct
{ 
    char name[8]; 
    int class; 
    char subclass[6]; 
    float math, phys, chem, engl, biol; 
}student; 
student Liuqi;

则Liuqi被定义为结构数组和结构指针。

添加新评论