【让你从0到1学会c语言】自定义类型详解(二)

简介: 【让你从0到1学会c语言】自定义类型详解(二)

位段的内存分配


位段内存空间的计算规则:

1.位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段


我们通过一个例子来了解一下位段的内存分配:


位段的跨平台问题:


1.位段包括unsigned int和signed int,是否有符号的这个问题没办法确定。(最高位是否为符号位)

2.位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机

器会出问题。

3.位段中,内存有低位向高位存储,还是有高位向低位存储不确定(没有确定是大端存储或者是小段存储)

4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是

舍弃剩余的位还是利用,这是不确定的。

位段和结构体对比时,位段可以很好的节省空间,而结构体不可以,但是位段存在明显的跨平台问题!!!


枚举类型:


枚举如何定义:

我们来介绍一下枚举:


它成员和成员之间是用逗号,而结构体用分号


RED,GREEN,BLUE叫做枚举的可能取值,而结构体的成员叫做成员变量

这里RED,GREEN,BLUE是有对应数字的,分别对应0,1,2


枚举的可能取值因为是枚举常量,所以不允许更改,但可以在一开始初始化。例如:RED=5;


枚举的优点:

我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点:

1. 增加代码的可读性和可维护性

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

3. 防止了命名污染(封装)

4. 便于调试

5. 使用方便,一次可以定义多个常量


枚举的使用:

我们利用通讯录来了解一个枚举使用的好处:

我们正常会写一个函数(printf)来显示选择什么代表什什么,而我们运用枚举就可以避免这个问题,直接输入操作。


联合体(共用体):


联合体的定义:

跟结构体相同,没有什么区别:

联合体的每个变量共用同一个地址。


联合体的缺点:

但共用体有个缺点,如下图,不能同时使用c或b或者y,一次只能使用其中一个


联合体的内存大小:

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。



相关文章
|
22天前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
17天前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
27 1
|
17天前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(下)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
22 0
|
13天前
|
存储 编译器 C语言
【C语言】自定义类型 -- -- 结构体、位段、枚举、联合体
【C语言】自定义类型 -- -- 结构体、位段、枚举、联合体
9 0
|
15天前
|
编译器 C语言 C++
c语言:自定义类型——结构体
c语言:自定义类型——结构体
10 0
|
15天前
|
存储 开发框架 编译器
C语言进阶—自定义类型:结构体,枚举,联合
C语言进阶—自定义类型:结构体,枚举,联合
|
16天前
|
存储 编译器 Linux
【C语言】自定义类型(结构体+枚举+联合)
【C语言】自定义类型(结构体+枚举+联合)
|
17天前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(中)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
23 0
|
17天前
|
编译器 C语言 C++
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(上)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
7 0
|
21天前
|
存储 C语言
C语言结构体—自定义类型—struct
C语言结构体—自定义类型—struct
21 0