枚举
枚举类型的定义
enum tag//枚举类型名称
{
member_one,//枚举常量
member_two,
/* ………… */
};
例如:
#include <stdio.h>
enum sex
{
male,//默认值为0 //可以写成 male=4 这样来修改赋值
female,//默认值为1,依次类推
};
int main()
{
enum sex s = male;//枚举初始化&赋值
s = female;//赋值时不能直接赋值整型
return 0;
}
enum tag_one
{
one,//0
two,//1
three,//2
};
enum tag_two
{
one = 3,//3
two,//4
three,//5
};
enum tag_three
{
one,//0
two = 7,//7
three,//8
};
枚举优点
增加了代码的可读性和可维护性
和 #define 定义的标识符相比,枚举有类型检查,更加严谨
防止了命名污染
便于调试
使用方便,一次可定义多个常量
联合体/共用体
联合体类型的定义
联合体是自定义类型,定义的变量包含一系列成员,所有成员共用同一块空间
union tag
{
/* member_list */
}/* varible_list */; //声明类似于结构体,也可以声明一个匿名联合体
例如:
#include <stdio.h>
union tag
{
int a;
char b;
double c;
};
int main()
{
union tag u = { .a = 10 };//初始化
printf("%zd\n", sizeof(u));//联合体变量的大小至少是最大成员的大小
printf("%p\n", &(u)); //这4个地址全都相同
printf("%p\n", &(u.a));
printf("%p\n", &(u.b));
printf("%p\n", &(u.c));
return 0;
}
联合体的特点
联合体的成员共用同一块内存空间,联合体变量的大小至少是最大成员的大小
使用联合体时只能使用其中一个成员变量
联合体大小的计算
联合体变量的大小至少是最大成员的大小
当最大成员大小不是最大对齐数整数倍时,就要对齐到最大对齐数的整数倍
#include <stdio.h>
union tag
{
int a;//自身大小为4 - 默认对齐数为8 - 对齐数(较小值)为4
char arr[5];//自身大小为5,元素类型为char,char大小为1 - 默认对齐数为8 - 对齐数为1
//5不是4的整数倍,则此联合体的大小为8,多的3个字节浪费掉
};
int main()
{
union tag u;
printf("%zd\n", sizeof(u));
return 0;
}
联合体的运用
大小端的判断
#include <stdio.h>
int check()
{
union tag
{
char a;
int b;
}u;
u.b = 1; //当b为1时,大端存储为00 00 00 01;小端存储为01 00 00 00,而a占其中第一个字节
return u.a;
//返回0表示大端
//返回1表示小端
}
int main()
{
int c = check();
printf("%d\n", c);
return 0;
}