联合体
创建和声明联合体
联合体和结构体的区别:联合体的特性是共享内存,不像结构体中元素各自使用各自的内存空间,联合体是通过关键字union进行声明的,如下所示:
typedef union data{
short i;
char ch;
float f;
}DATA;
计算字节大小
这里可以打印一下联合体所占的字节数,做一个观察,为什么说他是共享内存。这里它将打印所有属性中所占空间最大的属性字节数,因为它是共享内存,只要能存储的下最大的那一个即可,如果是结构体,这里得到的将是所有元素大小的总和。
printf("%d\n", sizeof(DATA a)); //结果为4,并非所有字节总数
遍历联合体
因为联合体拥有内存共享的特性,所以不能像结构体那样一次性为所有的元素赋值,然后再统一的打印出来,如果那样的话,因为他们共用同一处内存空间,所以会导致后面赋值的元素会覆盖先前赋值好的元素。所以想要遍历联合体中的每一个元素,我们可以给联合体中的每一个元素分别赋值,然后再分别打印出来。
#include<stdio.h>
typedef union data{
short i;
char ch;
float f;
}DATA;
int main()
{
DATA temp2;
temp2.i = 100;
printf("%hd\n", temp2.i);
temp2.ch = 'a';
printf("%c\n", temp2.ch);
temp2.f = 2.5;
printf("%.1f\n", temp2.f);
// printf("%hd, %c, %.1f\n", temp2.i, temp2.ch, temp2.f);
return 0;
}
判断字节序
之前我们使用过指针判断过字节序,这里使用联合体也可以判断字节序,具体的思路就是,我们可以在联合体中定义一个int型变量和一个char型变量,然后先给联合体中的int型变量赋一个16进制的值,先占用联合体的内存,然后使用联合体中的char型变量去取值,如果取到的两位数字刚好是16进制数最低位开始两位的数字,那么这就是小端序,不然就是大端序。
使用联合体判断字节序的具体代码如下:
#include<stdio.h>
typedef union data{
int i;
char ch;
}DATA;
int main()
{
DATA temp;
temp.i = 0x1234567; //一个16进制数占4位,一个八进制数占3位,一个二进制占1位
if(temp.ch == 0x12)
{
printf("%x", temp.ch);
printf("大端序\n");
}
else
{
printf("%x", temp.ch);
printf("小端序\n");
}
return 0;
}
注:每位16进制数在内存中占4bit,所以两个16进制数占用一个字节,也就能被一个char型的变量读取。
枚举
声明
枚举一般用于将一些数字变成有意义的变量名称,用在程序中使得可读性更好,枚举使用关键字enum来定义。当给枚举结构中的一个元素赋值之后,后面的元素依次加一,当然也可以为每一个元素都赋值,但是不推荐这样做。
typedef enum week
{
mon = 1, tus, wed, thu, fri, sat, sun
}WEEK;
注:给枚举结构中元素赋值只能在定义的时候赋值,在结构外面它被当做常量来对待,不能够再赋值。
使用
枚举类型的使用与结构体类型类似,在类型定义好自后,就可以直接使用了,它也能够使用typedef取一个别名。
#include<stdio.h>
#include<string.h>
typedef enum week
{
mon = 1, tus, wed, thu, fri, sat, sun
}WEEK;
int main()
{
enum week weekday;
WEEK workday;
workday = sun;
weekday = mon;
printf("%d\n", workday);
printf("%d\n", weekday);
weekday = wed;
printf("%d\n", weekday);
return 0;
}