这几天在往实习的地方弄东西,比较累,因此没有更新,在几天前我们学习了内存操作函数
,其与之前学习的字符串操作函数
相比,适用范围更加广泛,大家要注意掌握学习,今天我们将学习枚举
、位段
和联合体
,好了,话不多说,开整!!!!
枚举
谈起枚举
,其实在之前基础学习3,我们已经简要的进行了介绍,所谓枚举,也就是将所有的可能都列举出来
,如性别只有男、女,再来个中性??
枚举的定义如下:
enum 枚举类名
{
内容1,
内容2
};
可以看到和结构体
的定义方式较为相似,在枚举常量
定义完成后,其会存储为相应的值,如以下代码:
#include<stdio.h>
enum S
{
male,
famale
};
int main()
{
enum S s;
printf("%d %d",male,famale);
return 0;
}
我们编译运行,可以结果分别为0、1:
当然,在初始化时,初始值是可以更改
的,比如将male的值改为1,则后续将会继续向下编号
,如下代码:
enum S
{
male = 1,
famale
};
我们再次编译运行,可以得到以下结果:
未在初始化时,不可对其值进行更改
,如以下代码:
#include<stdio.h>
enum S
{
male = 1,
famale
};
int main()
{
enum S s;
famale = 4;
printf("%d %d",male,famale);
return 0;
}
编译运行,将会报错:
位段
位段
这个概念,其实我也是第一次听说过,在以前没有听说过这个内容,其意义为:
在结构体中,以比特位为单位开辟内存空间
其用法如下所示:
struct 结构体类名
{
变量类型 变量名:位数 ;
变量类型 变量名:位数 ;
};
比如以下代码:
#include<stdio.h>
struct tes
{
int a:2 ;
int b:6;
int c:30;
};
int main()
{
struct tes test;
test.a = 10;
test.b = 20;
printf("%d %d",test.a,test.b);
return 0;
}
从上述代码中,我们可以看到我们向内存中申请了整型变量a中的2个比特位,两个比特位也就是两根地址线
,最多
可以表示
2
2
=
4
2^2 = 4
22=4个数,无符号时,最大表示为3,因此下面的赋值将会导致溢出,所以打印时,不会打印出数字10,而b申请了6个比特位,最大表示为
2
6
=
64
2^6 = 64
26=64,因此不会发生溢出,所以可以顺利打印,我们编译代码查看是否是这样:
从结果中看确实是这样,一个有符号数
10,如果我们想要将其存储起来,至少保证
2
?
>
10
∗
2
2^?>10*2
2?>10∗2;因此,我们需要申请5位,再进行打印:
发现结果正确。
同时,在使用位段时,所要注意的是:
1、
位段中定义的变量类型必须为同类型,比如整型变量:int、unsigned int,signed int
2、位段中的位数不能超过32位(32位机器),64位机器不能超过64
联合体
联合体
,也被称为共用体
,也有是将不同类型的变量放在同一地址上
,
其使用方式如下:
union 类名
{
变量类型 变量名称 ;
变量类型 变量名称;
变量类型 变量名称;
};
比如以下代码所示:
#include<stdio.h>
union test
{
int a ;
char b;
char c[20];
};
int main()
{
union test tes;
printf("%p\n",&tes.a);
printf("%p\n",&tes.b);
printf("%p\n",&tes.c);
return 0;
}
编译程序,查看内部三个变量的地址:
可以看见确实联合体是共同使用一个地址
。
下节我们再与结构体一起,学习联合体的大小的有关问题
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!