【进阶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

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

相关文章
|
6月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
2月前
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
28 3
|
2月前
|
存储 编译器 Linux
C语言——自定义类型
C语言——自定义类型
|
2月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
4月前
|
存储 安全 编译器
C语言自定义类型
C语言自定义类型
37 10
|
4月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
50 1
|
6月前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
78 7
|
6月前
|
编译器 C语言 C++
【C语言基础】:自定义类型(二) -->联合和枚举
【C语言基础】:自定义类型(二) -->联合和枚举
|
6月前
|
编译器 C语言
【C语言基础】:自定义类型(一)--> 结构体-2
【C语言基础】:自定义类型(一)--> 结构体
|
6月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
58 0