C/C++编程笔记:C语言枚举与联合的区别,帮你一步步深度解析

联合与枚举很多小伙伴老是搞混了,这次记下来,与大家分享,希望大家能够有所收获。

enum是枚举型

union是联合型,共用体,成员共用一个变量缓冲区 现在基本已经不用了。

C/C++编程笔记:C语言枚举与联合的区别,帮你一步步深度解析_第1张图片

枚举类型 

在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

 1.1 枚举类型的定义和枚举变量的说明 

1. 枚举的定义枚举类型定义的一般形式为:     enum 枚举名{ 枚举值表 };

在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

2. 枚举变量的说明

如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。

设有变量a,b,c被说明为weekday,可采用下述任一种方式:

        enum weekday{ sun,mou,tue,wed,thu,fri,sat };

        enum weekday a,b,c; 

        或者为:

        enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c; 

        或者为:

        enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;

 1.2 枚举类型变量的赋值和使用 枚举类型在使用中有以下规定: 

1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。

例如对枚举weekday的元素再作以下赋值:     sun=5; mon=2; sun=mon; 都是错误的。

2. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。

如在weekday中,sun值为0,mon值为1,…,sat值为6。

【例】 main(){ 

 enum weekday 

 { sun,mon,tue,wed,thu,fri,sat } a,b,c;  

a=sun;     b=mon;     c=tue;

printf("%d,%d,%d",a,b,c); }

说明:

只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:     a=sum; b=mon; 是正确的。而:     a=0; b=1;

是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。 如:

a=(enum weekday)2;

其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:

a=tue;

还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。

【例】 

main(){   

enum body { a,b,c,d } month[31],j;  

int i; 

j=a; 

for(i=1;i<=30;i++){

month[i]=j; 

j++; 

if (j>d) j=a;    

}

for(i=1;i<=30;i++){

switch(month[i]) 

case a:printf(" %2d  %c\t",i,'a'); break;

case b:printf(" %2d  %c\t",i,'b'); break; 

case c:printf(" %2d  %c\t",i,'c'); break;   

case d:printf(" %2d  %c\t",i,'d'); break;    

default:break;   

    }  

    printf("\n"); 

C/C++编程笔记:C语言枚举与联合的区别,帮你一步步深度解析_第2张图片

联合(union):

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

  联合也是一种新的数据类型, 它是一种特殊形式的变量。

  联合说明和联合变量定义与结构十分相似。其形式为:

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

其实做为一个编程学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C++交流群1108152000,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

你可能感兴趣的:(C语言)