1.联合体(联合体所有成员共享一块内存)
联合union是一个能在同一个存储空间存储不同类型数据的类型。
联合体所占的内存长度等于其最长成员的长度,也有叫做共用体。
联合体虽然可以有多个成员,但同一时间只能存放其中一种。
union man{
int a;
char b;
int c;
char d;
int *p;
};
int main(){
union man m;
m.b = 20;
m.a = 1;
printf("%d\n",m.b);//输出了0
m.a = 0x12345678;
m.b=0;
printf("%x\n",m.a);//输出了12345600,因为a是int,b是char,只覆盖了小端
printf("%lu\n",sizeof(m));//输出4
printf("%p,%p,%p,%p,%p\n",&m,&m.a,&m.b,&m.c,&m.d);//地址输出全部都一样!
m.p = malloc(10 * sizeof(int));
//m.a2=0; 联合体变量的任何一个成员复制都会影响其他变量的值
free(m.p);
return 0;
}
2.枚举类型
可以使用枚举(enumerated type)声明代表整数常量的符号名称,关键字enum创建一个新的枚举类型。
实际上,enum常量是int类型的
enum mySex {male,female};//默认时,枚举列表中的常量被指定为0,1,2等
struct man{
char name[20];
int age;
enum mySex sex;
};
int main(){
struct man m;
strcpy(m.name,"刘德华");
m.age = 30;
m.sex = male;
return 0;
}
3.typedef 改名
typedef是一种高级数据特性,它能使某一类型创建自己的名字
typedef unsigned char BYTE
typedef 数据类型 别名
typedef struct man M
- 与#define不同,typedef仅限于数据类型,而不是能是表达式或具体的值
- typedef是编译器处理的,而不是预编译指令
- typedef比#define更灵活
直接看typedef好像没什么用处,使用BYTE定义一个unsigned char。使用typedef可以增加程序的可移植性。
网友评论