【进阶C语言】自定义类型(2)

简介: 本节内容大致目录如下:1.结构体2.位段3.枚举4.联合(共用体)以上都是C语言中的自定义类型,可以根据我们的需要去定义

三、枚举

所谓枚举,就是一一列举

1.枚举的定义

枚举,全名又称枚举常量,属于常量中的一种。定义枚举常量的时候需要用到enum的关键字。

(1)定义格式

enum Sex//性别常量
{
  Man,//男
  Woman,//女
  Sercet,//保密
};

1.enum Sex称为枚举类型,Man、Woman和Sercet称为枚举常量


2.格式与结构体相似,但是每个枚举常量后面是逗号。


3.枚举常量的常量值默认从0开始。类似#define定义的常量一样,在后续的使用中他就是一个数字。


4.枚举常量的名字一般首字母大写或者全部大写,便于识别。


(2)打印枚举常量

#include<stdio.h>
enum Sex//性别常量
{
  Man,//男
  Woman,//女
  Sercet,//保密
};
int main()
{
  printf("%d\n", Man);
  printf("%d\n", Woman);
  printf("%d\n",Sercet);
  return 0;
}

结果:

image.png

(3)修改默认值

第一种:修改起始值,后续的值会依次递增

#include<stdio.h>
enum Sex//性别常量
{
  Man=5,
  Woman,
  Sercet,
};
int main()
{
  printf("%d\n", Man);
  printf("%d\n", Woman);
  printf("%d\n",Sercet);
  return 0;
}

image.png

第二种:任意赋值

#include<stdio.h>
enum Sex//性别常量
{
  Man=5,
  Woman=3,
  Sercet=100,
};
int main()
{
  printf("%d\n", Man);
  printf("%d\n", Woman);
  printf("%d\n",Sercet);
  return 0;
}

image.png

注意:只能在定义的时候赋值,但是不能在后续的步骤中修改


2.枚举的的优点

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



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


枚举常量是有类型的(枚举类型),而#define定义的却没有

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



(4)便于调试



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


四、联合(共用体)

1.联合体的定义

(1)联合体是一种特殊的自定义类型,特征是这些变量公用一块空间。定义需要用到联合关键字union。


(2)代码格式

union Un
{
  char c;
  int i;
};
与结构体格式相同,但是关键字不一样。

联合变量的创建:

#include<stdio.h>
union Un
{
  char c;
  int i;
};
int main()
{
  union Un u1;//联合变量
  printf("%zd",sizeof(u1));//计算联合变量的大小
  return 0;
}

2.联合体的特点

(1)特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联

合至少得有能力保存最大的那个成员)。

#include<stdio.h>
union Un
{
  char c;
  int i;
};
int main()
{
  union Un u1;
  printf("%p\n", &u1);
  printf("%p\n", &(u1.c));
  printf("%p\n",&(u1.i));
  return 0;
}

运行结果:

image.png

这三个的起始地址都一样,那在内存中是什么样的呢?

image.png

他们是公用一块内存的,如果修改其中一个,另一个是很有可能就被修改了。

(2)利用其特点解决的问题

利用联合体判断当前机器是小端还是大端字节序?

#include<stdio.h>
int check_sys()
{
  union Un
  {
    char c;
    int i;
  }u;
  u.i = 1;
  return u.c;
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
    printf("小端\n");
  else
    printf("大端\n");
  return 0;
}

原理:

image.png

返回的u.c,拿到的是i的第一个字节;如果小端存储。第一个字节(低字节)就会存储在低地址处,也就是起始位置,反之一样。


3.联合大小的计算

(1)联合的大小至少是最大成员的大小。(不一定就是最大的)

(2)当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。(蹲守结构体的内存对齐规则)

#include<stdio.h>
union Un
{
  char a[5];
  int i;
};
int main()
{
  printf("%zd\n",sizeof(union Un));
  return 0;
}

image.png

联合体一般用于有公用部分的时候,如果商场的购物系统,很多商品都有共同的属性,如:价格等。

相关文章
|
2天前
|
存储 编译器 C语言
[C语言]自定义类型(结构体~枚举~联合体)
[C语言]自定义类型(结构体~枚举~联合体)
|
8天前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习
|
8天前
|
存储 Linux C语言
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-2
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
8天前
|
自然语言处理 Linux 编译器
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-1
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
8天前
|
存储 编译器 C语言
C语言进阶第十课 --------文件的操作-1
C语言进阶第十课 --------文件的操作
|
8天前
|
存储 程序员 C语言
C语言进阶第九课 --------动态内存管理-2
C语言进阶第九课 --------动态内存管理
|
8天前
|
编译器 C语言
C语言进阶第九课 --------动态内存管理-1
C语言进阶第九课 --------动态内存管理
|
8天前
|
C语言
C语言进阶第八课 --------通讯录的实现
C语言进阶第八课 --------通讯录的实现
|
13天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
13天前
|
编译器 Linux C语言
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)