枚举
顾名思义就是把可能的取值一一列举。
比如我们现实生活中:
一周的星期一到星期天是有限的七天,可以一一列举。
性别有:男,女,保密,可以一一列举。等等
枚举类型的定义
enum Day //星期
{
Mon,
Tue,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex //性别
{
male,
female,
secret
};
{}中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,默认从0开始,当然也可以在定义的时候赋初值。
例如:
enum Sex
{
male=1,
female=2,
secret=0
};
枚举的优点:
1. 增加代码的可读性和可维护性。
2. 和define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止命名污染。
4. 便于调试。
5. 一次可以定义多个常量。
枚举的使用
enum color
{
red = 1,
green=2,
blue=4
};
enum color clr = green;
clr = 6;
这样可以吗??
运行还是会打印1,2,4。所以枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
联合体
联合是一种特殊的自定义类型,特征是成员共用同一块空间,所以联合体又称结构体。
联合类型的声明与定义
union Un
{
char c;
int i;
};
union Un un;
联合的特点
联合的成员共用同一块内存空间。
先看一段代码:
#include<stdio.h>
#include<stdlib.h>
union Un
{
char c;
int i;
};
int main()
{
union Un un;
printf("%d\n", &(un.c));
printf("%d\n", &(un.i));
system("pause");
return 0;
}
运行:
由此课件un.c 与un.i所在的空间地址是一样的,即证明了联合共用同一块空间。
联合大小的计算
1. 联合的大小至少是最大成员的大小。
2. 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到它的最大整数倍。
对齐数=编译器默认的一个对齐数与该成员大小的较小值。VS默认对齐数 8 Linux 默认对齐数 4。
练习
union Un
{
char c;
int i;
};
char c 1个字节,最大对齐数为1;
int i 4个字节,最大对齐数为4;
4是最大对齐数4的倍数,所以sizeof(union Un)=4;
union Un1
{
char c[5];
int i;
};
char c[5] 5个字节,最大对齐数为1;
int i 4个字节,最大对齐数为4;
5不是最大对齐数4的倍数,所以sizeof(union Un)=8;
当前机器的大小端问题
#include<stdio.h>
#include<stdlib.h>
union Un
{
char c;
int i;
};
int main()
{
union Un un;
int ret = 0;
un.i = 1;
ret = un.c;
if (ret == 0)
{
printf("大端!\n");
}
else
printf("小端!\n");
system("pause");
return 0;
}
分析:
运行:
联合和结构体的巧妙应用
关于结构体的知识:结构体
将long类型的IP地址,转为点分十进制表示
参考代码:
#include<stdio.h>
#include<stdlib.h>
union ip_addr
{
unsigned long addr;
struct //匿名结构体类型
{
unsigned char c1;
unsigned char c2;
unsigned char c3;
unsigned char c4;
}ip;
};
int main()
{
union ip_addr my_ip;
my_ip.addr = 176238749;
printf("%d.%d.%d.%d\n", my_ip.ip.c4, my_ip.ip.c3, my_ip.ip.c2, my_ip.ip.c1);
system("pause");
return 0;
}
运行: