C语言 枚举与联合

枚举与联合
先来看看两者的形式

枚举:

#include<stdio.h>
enum Day
{
    Mon,
    Tues,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
};
int main()
{
    
    return 0;
}

联合体(也叫共用体):

#include<stdio.h>
union Un
{
    char c;
    int i;
};
int main()
{
    
    return 0;
}

下面分别解析这两种自定义变量类型:

枚举:
由关键字enum 和标签组成(类似于结构体)
{}里的内容是枚举类型的可能取值

枚举类型的初始化:
枚举类型大括号里代表这种类型的可能取值,一个成员代表一个值,例如现在未进行初始化,则第一个Mon 代表0,第二个Tues 代表1…以此类推
,分别代表一个初始值

当然我们也可以手动赋予这些变量以初始值,格式如下:

#include<stdio.h>
enum day
{
    mon = 1,
    tues = 2,
    wed = 5,
    thur = 10
};
int main()
{
    
    return 0;
}

这样也是一种赋予初始值的方法,和上一种系统自动赋值相比,这一种更自由

当然赋初始值的方法还有很多
例如我们只给第一个元素赋予5,那么其他每个元素就是依次加一

因为枚举,联合,和之前的结构体位段一样,都是自定义变量类型,所以关键字加标签都表示一种变量类型,例如现在的enum day 就是一种变量类型

枚举其实就是一种给一个变量赋予一个定值的做法,类似于define宏定义,只不过枚举里有变量类型,而define作用的只是一个符号,不是变量
此外,枚举优于define的点还有 枚举一次可以定义多个变量,而define一次一个

另外,如果想新定义一个枚举变量

用其他类型的数据是不行的
例如这样是不行的

enum day xingqiba = 8;

需要用枚举类型来赋值
比如这样(mon的枚举变量在上面已经定义)

enum day xingqiba = mon;

关于联合体(共用体)

联合体的成员一般共用一块空间,这样一个联合变量的大小,至少是其中最大成员的大小

例如:

#include<stdio.h>
union Un
{
    char a;
    int b;
}s1;
int main()
{
    printf("%d\n",sizeof(s1));
    return 0;
}

结果是

4
Program ended with exit code: 0

看,是不是至少是最大成员的大小,int~4个字节
原理是什么呢?
原来int 的4个字节 把第一个字节拿出来和char型变量共用,意思是我的第一个字节就是你(有点浪漫)
那么就会导致一个问题
改动char 型变量的时候,int型的值一定会改

那么 改动int的值得时候,char一定会改吗?

答案:要看是大端存储还是小端存储

char型和int型共用的字节 就是低地址处的那一个字节
那么int 有4个字节 比如(用16进制表示,即8个16进制位)
int a = 0x11223344
可见a的比较小的值是44,那他如果存储在低地址处就是小端,存储在高地址处就是大端(这个因电脑和环境而异)
例如小端(从左到右为低地址到高地址):
44 33 22 11
大端就是:
11 22 33 44
那么char始终共用的就是第一个字节,也就是低地址处的那一个字节,如上例所示,是不是char的值和44一样还是和11一样就不一定了

如何判断当前机器是大端还是小端?

我们可以设计一个函数,

int a = 1;
char* p = &a;
printf("%d",*p);

这样我们能把a的第一个字节取出来,如果是小端存储 打印1,如果是大端存储打印0
就能分辨了

最后整个联合体的大小,至少是最大成员的大小,不过不一定是,还要是最大对齐数的倍数

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值