【1】共用体
概念:不同数据类型的数据使用共同的存储区域,这种数据构造类型称为共用体,又称联合体。
定义格式:
union
{
成员列表;
};
例如:
union data
{
char cval;
int ival;
float fval;
};
共用体类型变量定义:
(1)先定义共用体类型,后定义变量。
union data
{
char cval;
int ival;
float fval;
};
union data a,b,c;
(2)定义共用体类型的同时定义变量。
union data
{
char cval;
int ival;
float fval;
}a,b,c;
如果不再定义新的变量,也可以将共用体的名字省略:
union
{
char cval;
int ival;
float fval;
}a,b,c;
计算大小:
结构体占用内存大于等于所有成员占用内存的总和,因为成员之间可能存在空隙,而共用体占用的内存空间,等于最大的成员变量占用的内存。
共用体采用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,会覆盖掉原有的成员数据。
比如 :共用体data里占用内存最大的是int类型数据,占用4个字节,那么共用体data占用的内存大小为4。
union test
{
char s[20];
int b;
double c;
}a;
sizeof(a) = 20;
通过共用体验证大小端:
#include<stdio.h>
union test
{
char a;
int b;
}num;
int main(int argc, const char *argv[])
{
num.b = 0x12345678;
printf("%#x\n",num.a);
return 0;
}
【2】枚举:
定义:只能取预先定义值的数据类型是枚举类型。
格式: enum 枚举类型名
{
枚举元素列表
};
例如: 列出一个星期有几天:
enum week
{
Mon, Tues, Wed, Thurs, Fri, Sat, Sun
};
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,
因为枚举值默认从0开始,往后逐个加1,也就是说,week 中的 Mon、Tues ...... Sun
对应的值分别为 0、1 ...... 6。
我们也可以给每个名字都指定一个值:
enum week
{
Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7
};
由于枚举类型值逐个递增1,我们也可以只给第一个名字指定一个值:
enum week
{
Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun
};
说明: 1)枚举类型是一种类型,通过它可以定义枚举变量
enum week a,b,c;
2)可以将列表里的值赋给枚举变量
enum week a = Mon, b = Web, c = Sat;
3)枚举列表中的Mon、Tues、Wed这些标识符的作用范围是全局的(严格来说是 main() 函数内部)
不能再定义与他们名字相同的变量。
4)Mon、Tues、Wed等都是常量,不能再次赋值,只能将他们赋给其他变量。
示例:判断用户输入的是星期几。
#include <stdio.h>
int main(){
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch(day){
case Mon: puts("Monday"); break;
case Tues: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thurs: puts("Thursday"); break;
case Fri: puts("Friday"); break;
case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("Error!");
}
return 0;
}