• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

C学习-基础:共用体类型 union 和 枚举类型 enum

image.png

共用体类型

把不同类型的数据存放在同一段内存单元中,这些不同类型的数据分时共享同一段内存单元。

union 共用体类型名 {成员列表};

  • 定义共用体类型的关键是 “union”。同结构类型的定义方式相似

  • 成员可以是基本数据类型,也可以是数组,指针,以及其他构造类型。

  • 必须先定义共用体类型,然后再定义该类型的变量。

共用体与结构体的区别:

  • 结构体类型是异址的,而共用体类型是同址的。

  • 结构体长度是各成员长度之和,而共用体长度是成员列表中长度最长的成员长度。

共用体变量的定义

定义类型后说明变量
union data
{   char c;
     int i;
     float f; 
};
union data u1,u2;

上面定义占用内存情况:

image.png

共用体变量成员的引用方法

1). 运算符

共用体变量中引用成员也是用  .运算符

union data u1;
u1.i=12;
u1.f=3.4;

2)->运算符

若用共用体类型的指针来指向共用体变量,则用 ->来访问成员。

union data *p=&u1;
p->i=12;
p->f=3.4;

枚举类型

  • "枚举" 就是将变量可能的值一一列举出来,变量的值只能取列举出来的值之一。

  • 枚举类型的元素为固定常量的集合。

枚举类型的定义 

enum 枚举类型名

{ 枚举值表 };

枚举值表::枚举值表中应罗列出所有可用值,这些值枚举元素

例如:

enum COLOR{red,green,blue};
enum WEEKDAY { sun,mon,tue,wed,thu,fri,sat};

枚举变量的定义

和结构体一样,3种方法

先定义枚举类型,再定义枚举变量a,b,c 

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

在定义枚举类型时直接定义变量:

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

省略枚举名称,直接定义枚举变量

 enum {spring, summer, autumn, winter} a b c;

枚举变量的说明

  • 枚举元素不能赋值。定义枚举类型时可以指定其值

  • C语言编译器会将枚举元素(spring、summer等)作为整型常量处理,称为枚举常量。

  • 枚举元素本身由系统定义了一个表示序号的数值,默认从0开始顺序定义为0,1,2…。也可以在定义枚举类型时改变枚举元素的值,没有指定值的枚举元素,其值为前一元素加1。

例子:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    enum WEEKDAY
    {
        sun,   //默认枚举元素的值从 0 开始
        mon,
        tue,
        wed = 8,  //自定义 枚举元素的值
        thu,      //他值为 前一个 +1
        fri,
        sat
    } a, b, c, d;
    a = sun;   // 等价于 a = 0;
    b = mon;   // 等价于 a = 1;
    c = wed;
    d = thu;
    printf("a序号:%d\nb序号:%d\nc序号:%d\nd序号:%d", a, b, c, d);
    scanf("%d", &waitag);
    return 0;
}

输出

a序号:0
b序号:1
c序号:8
d序号:9
  • 枚举值可以作判断

例如:

enum WEEKDAY day;
 if (day == mon)…
 if (day > sun)…

打印 枚举类型 定义的变量

C语言枚举类型只能打印为%d格式,而且打印的结果是当前这个元素在枚举类型的位置。

enum enumtest{test1, test2};
printf("%d",test1);

此时打印结果是0,表示test1在他的枚举类型定义为第0个元素。

如果要打印出来test1的话,可以增加一个字符串数组,通过位置索引来打印test1.

int main(){
        enum enumtest{test1,test2};
        char *s[]={"test1","test2"};
        printf("%d\n",test2); // test2 为1 在枚举中定义的变量
        printf("%s\n",s[test2]); //这里的 test2 为变量 1 ,是在枚举中定义的哦
        return 0;
}

打印结果为 :

1
test2


0
0
下一篇:C学习-函数:类型定义符 typedef

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。