自定义类型:联合和枚举

1.联合体

    1.1联合体类型的声明

联合体与结构体类似,都是由一个或多个成员组成,并且各个成员可为不同的类型。

联合体最大的特点:所有的成员公用同一块内存空间,所以联合体还有一个别称叫共用体

注意:给联合体一个成员赋值,其他成员的值也会变化

# include <stdio.h>
// 联合类型的声明
union Un
{
 char c;
 int i;
};
int main ()
{
 // 联合变量的定义
 union Un un = { 0 };
 // 计算连个变量的⼤⼩
 printf ( "%d\n" , sizeof (un));
 return 0 ;
}

  1.2联合体的特点 

联合体的成员是共用同一块内存空间的,所以联合变量的大小至少是最大成员大小。

# include <stdio.h>
// 联合类型的声明
union Un
{
 char c;
 int i;
};
int main ()
{
// 联合变量的定义
union Un un = { 0 };
un.i = 0x11223344 ;
un.c = 0x55 ;
printf ( "%x\n" , un.i);
return 0 ;
}

最终输出的结果为:

11223355

 由于联合体是共用一块内存空间的,故i的第四个字节的内容就被修改为55了。

以下为un的内存布局图:

1.3相同成员的结构体和联合体对比

 二者最大的不同就是内存空间的利用率

结构体:

struct S
{
 char c;
 int i;
};
struct S s = { 0 };

联合体: 

 union Un

{

    char c;

    int i;

};

union Un un = {0};

以下为二者的数据在内存中的分布图:

 1. 4联合体大小的计算

联合的⼤⼩⾄少是最⼤成员的⼤⼩。
当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
# include <stdio.h>
union Un1
{
 char c[ 5 ];
 int i;
};
union Un2
{
 short c[ 7 ];
 int i;
};
int main ()
{
 // 下⾯输出的结果是什么?
 printf ( "%d\n" , sizeof ( union Un1));
 printf ( "%d\n" , sizeof ( union Un2));
 return 0 ;
}
对于Un1,最大对齐数为int类型的4,而最大成员 char c[5]的大小为5,故Un1的大小为最大对齐数的两倍即为8,同理可得出Un2的大小为16。

2.枚举类型

  2.1枚举类型的声明

   顾名思义枚举就是列举,比如:列举星期,列举性别,列举颜色

代码如下:

enum Day // 星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex // 性别
{
 MALE,
 FEMALE,
SECRET
}
enum Color // 颜⾊
{
 RED,
 GREEN,
 BLUE
};

 上面的enum Day,enum Sex,enum Color都是枚举类型。

{}中的内容为枚举常量

这些可能取值都是有值的,默认从0开始,依次递增1,也可以在声明枚举类型的时候赋初值,如下所示:

enum Color // 颜⾊
{
 RED= 2 ,
 GREEN= 4 ,
 BLUE= 8
};

 2.2枚举类型的优点 

   枚举类型的作用与#define的作用类似,但相较于#define,枚举类型有属于自己的优势:
1.增加代码的可读性和克维护性。

2.相较于#define定义的标识符比较枚举有类型检查,更加严谨。

3.便于调试,预处理会删除#define定义的符号

4使用方便,一次可以定义多个常量、

5.枚举常量是遵循作用域规则,枚举声明在函数内,只能在函数内使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值