自定义类型(二)

简介: 自定义类型

2.枚举


顾名思义就是列举,将有可能的值一一列举出来

例如


月份有12个月可以一一列举
三原色也可以列举


2.1 枚举类型的定义


enum Day//星期
{
  Mon,
  Tues,
  Wed,
  Thur,
  Fri,
  Sat,
  Sun
};
enum Color//三原色
{
  Red,
  Green,
  Blue
};


以上定义的 enum Day和 enum Color都是枚举类型

{}中的内容是枚举类型的可能取值,也称作枚举常量

这些可能的取值都是有初值的,默认第一个枚举常量的值是从0开始,依次递增,也可以在定义枚举类型是赋予初值。


2.2 枚举的优点


1. 增加代码的可读性和可维护性
 2. 相比于 `#define`定义的全局变量,枚举有类型,更加严谨
 3. 防止命名污染(将整个枚举常量封装起来)
 4. 便于调试
 5. 使用方便,一次可定义多个枚举常量


2.3 枚举的使用


枚举的使用其实就是利用枚举常量本身就有一定的数值,然后给其他变量赋值。

例如


enum Sex
{
  //赋以初值
  nan=1,
  nv=2,
  secret=3
};
int main()
{
  enum Sex ma = nan;
  printf("%d\n", nan);
  return 0;
}

cc2e1112319b30de02de44da9f1665c0_d1a925dabd544d4bae7b06b45f326e18.png


3.联合(又称共用)


3.1 联合类型的定义


联合也是一种特殊的自定义类型,包含一系列的成员,特殊的是这些成员共用一块空间(也称作共用)


//联合类型的声明
union M
{
  char c;
  int i;
};
int main()
{
  //联合变量的定义
  union M m;
  //计算联合变量的大小
  printf("%d\n", sizeof(m));
  return 0;
}


d3a0a5e7e04e214b993601081e667c36_6bcf179868e34296a9ed0d4db48077eb.png

这里计算出的联合变量的大小就充分说明共用的思想,具体怎么共用的,接下来慢慢解析。


3.2 联合的特点


联合的成员是共用同一块内存空间,联合变量的大小至少是最大成员的大小
联合至少要能确保保存其中最大的成员。


union M
{
  char c;
  int i;
};
int main()
{
  union M m;
  printf("%p\n", &(m.c));
  printf("%p\n", &(m.i));
  return 0;
}


217d38555b784858bab988aa1eafd47e_2b50b4e3b78b4dff83bfb93b68761b9c.png

这里可以发现两个成员的地址是相同的,更一步体现了共用的思想


3.3 联合大小的计算


1. 联合的大小至少是最大成员的大小
 2. 当最大成员大小不是最大对齐数的整数倍时,联合的总大小就要
 对齐到最大对齐数的整数倍(4byte或者1byte)。


union M
{
  char c[5];
  int i;
};
int main()
{
  union M m;
  printf("%d\n",sizeof(m));
  return 0;
}


e3cccac1b3846e2330d8cd477e0a09fe_1bd192749fdf49f0b64e456428d48cf1.png


首先 char c[5],占5个字节, int i占4个字节,当然是共用的,此时联合总大小已是5个字节,由于最大成员 char c[5]的大小不是最大对齐数(4)的整数倍,联合的大小就要求对齐到最大对齐数的整数倍,最后联合的大小就是8个字节,下图便于理解


5909f76435d1db633270213415bc39fc_90e8f02292ca490abad9e87b4b948be2.png


可以利用联合共用内存空间这个特点,写个程序去判断大小端


int check()
{
  union M
  {
  char c;
  int i;
  }m;
  m.i = 1;
  return m.c;
}
int main()
{
  int ret = check();
  if (ret == 1)
  {
  printf("小端\n");
  }
  else
  printf("大端\n");
  return 0;
}

3974a999135bb806ac1899d3a9ed18c6_44b0d9d7571c418b94f36532d70e7faf.png

49fc092adb36c48136c7592cded1d212_47a15dc80d724e8b95a6684111427bea.png


相比于通过指针去访问然后返回,这个方法是非常的巧妙。

(这里的大小端在内存的存储中有详细的讲解

link感兴趣的可以去看看)


目录
相关文章
|
7月前
|
存储 Linux C++
自定义类型讲解
自定义类型讲解
82 0
|
6月前
|
存储 编译器 Linux
自定义类型详解(1)
自定义类型详解(1)
50 5
|
6月前
自定义类型详解(2)
自定义类型详解(2)
47 1
|
7月前
|
存储 移动开发 API
其他内置类型
本文介绍了 .NET 中的 Console 类和 Environment 类。Console 类提供了控制台输入输出的功能,如设置背景色和前景色、打印文本、读取行和发出蜂鸣声。而 Environment 类则包含有关全局环境的信息和方法,如当前目录、进程路径、处理器数量、操作系统信息等。另外,文章还提及了 .NET Framework 的 AppDomain(用于表示应用程序域,但在 .NET Core 中功能减弱)和 .NET Core 中新引入的 AppContext 类,用于存储全局数据和开关。
|
7月前
|
编译器 Linux C++
自定义类型详解
自定义类型详解
|
7月前
|
编译器 C++
自定义类型
自定义类型
|
7月前
|
C++
c++基本内置类型
c++基本内置类型
53 0
|
存储 算法 程序员
自定义类型总结
自定义类型总结
77 0
|
存储
自定义类型超详细解答!!!!!(下)
自定义类型超详细解答!!!!!
|
编译器 C++
自定义类型超详细解答!!!!!(上)
自定义类型超详细解答!!!!!