位段,枚举,联合

简介: 位段,枚举,联合

目录

位段

位段的声明

位段的内存分配

位段的意义

位段的跨平台问题

总结

枚举

枚举的定义

枚举的初始化

枚举的优点

总结

联合(共用体)

共用体的内存分配:

与结构体的区别

联合体大小的计算

联合体的缺点

位段

位段的声明

和结构体的声明极其类似不同点

(1),位段的成员必须是int ,unsigned,  int 或  signed int,char。

(2),位段的成员名后边有一个冒号和一个数字。

比如:

struct A
{
  int _a : 2;
  int _b : 5;
  int _c : 10;
  int _d : 30;
};

位段的内存分配

1.位段的成员可以是int ,unsigned,  int   ,signed int或者是 char(属于是整形家族)类型。


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


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


eg:

struct A
{
  int _a : 2;
  int _b : 5;
  int _c : 10;
  int _d : 30;
};
int main()
{
  struct A s;
  printf("%d", sizeof(s));
  return 0;
}

输出:

8

位段的意义

位段存在的意义在于节省空间

若换为结构体,上面程序将占用16个字节。

位段的跨平台问题

1.int 位段被当成有符号数还是无符号数是不确定的。

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

3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的 位还是利用,这是不确定的。

总结

跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

枚举

枚举就是一一列举。

枚举的定义

enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。

enum Day
{
  //枚举的可能取值————枚举常量
  Mon,        //0
  Tues,       //1
  Wed,        //2
  Thur,       //3
  Fri,        //4
  Sat,        //5
  Sun         //6
};

枚举常量在定义时,会自动给它赋上初始值,从零开始,也可以在定义时自己给它赋值,赋值后在调用时是无法更改给它赋的值的。

枚举的初始化

enum Sex
{
  //枚举的可能取值
  MALE,
  FEMALE,
  SECRET
};
int main()
{
  enum Sex  n = MALE;
  enum Sex m = FEMALE;
  return 0;
}

枚举的优点

1.便于调试。

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

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

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

5.防止命名污染(封装)。

总结

注意:


(1)enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。


(2)枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。但注意命名时要提高程序的可读性。枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。


(3)枚举数据表的值都是整数。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。


(4)可以在定义类型时对枚举常量初始化。


(5)枚举类型可以进行比较。


(6)枚举常量不是字符串,不能用%s方式输出字符串。


(7)枚举型是预处理指令#define的替代

联合(共用体)

联合的定义

“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。


eg:

union Un
{
  char c;
  int i;
};

共用体的内存分配:

共用同一块空间

union Un
{
  char c;
  int i;
};
int main()
{
  union Un c;
  printf("%d",sizeof(c) );
}

输出结果:

4

与结构体的区别

联合的声明和结构与结构体类似,但是本质不同。

  联合的所有成员引用的是内存中的相同位置。当你想在不同时刻把不同的东西存储于同一位置时,就可以使用联合。


 构体中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。


 而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

联合体大小的计算

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

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

联合体的缺点

联合体中的成员变量不能同时使用。

相关文章
|
3月前
|
Linux C语言 C++
自定义类型——结构体、枚举和联合
自定义类型——结构体、枚举和联合
|
20天前
|
编译器
自定义类型:联合和枚举
自定义类型:联合和枚举
19 0
|
6月前
|
存储
介绍位段,枚举和联合
介绍位段,枚举和联合
38 2
|
存储
详解位段+枚举+联合(接结构体)(一)
详解位段+枚举+联合(接结构体)
54 0
|
6月前
|
存储 编译器 C语言
【自定义类型】--- 位段、枚举、联合
【自定义类型】--- 位段、枚举、联合
89 0
|
12月前
|
编译器 Linux C语言
讲一讲C语言中的结构体、位段、枚举与联合
讲一讲C语言中的结构体、位段、枚举与联合
结构体、枚举、联合详解(下)
结构体、枚举、联合详解(下)
36 0
|
编译器 C语言 C++
结构体、枚举、联合详解(上)
结构体、枚举、联合详解(上)
32 0
|
存储
详解位段+枚举+联合(接结构体)(二)
详解位段+枚举+联合(接结构体)
48 0
|
存储 C语言 C++
位段、枚举、联合
位段的声明与结构体类似,有两个不同: 位段的成员必须是int、signed int、unsigned int或char(属于整形家族) 位段的每个成员后边有一个冒号和一个数字(这个数字大小不能超过前面数据类型的大小)
131 0
位段、枚举、联合