C语言中的自定义类型之结构体与枚举和联合详解

C语言中的自定义类型之结构体与枚举和联合详解

什么是自定义类型

C语言中的自定义类型是开发人员按照自己的需求所定义的类型。通过自定义数据类型,可以使数据类型的使用更为规范,提高程序的可读性和可维护性。

C语言中常见的自定义类型包括结构体、枚举和联合。

结构体

结构体是一种用户自定义的数据类型,它允许我们将不同类型的变量组合在一起,形成一个新的数据类型。结构体中的变量称为“成员”。

结构体的定义方式如下:

struct 结构体名 {
    类型1 成员名1;
    类型2 成员名2;
    ...
};

例如,我们定义了一个表示人的结构体:

struct Person {
    char name[20];
    int age;
    char gender;
};

在这个结构体中,我们定义了三个成员:姓名name、年龄age和性别gender。

我们可以通过如下方式定义并初始化一个Person类型的变量p:

struct Person p = {"小明", 18, 'M'};

我们也可以通过以下方式访问结构体中的的成员:

printf("姓名:%s\n", p.name);
printf("年龄:%d\n", p.age);
printf("性别:%c\n", p.gender);

枚举

枚举是一种用户自定义的数据类型,它能够将变量的取值限制在一个有限的范围内。枚举常用于状态码等场景。

枚举的定义方式如下:

enum 枚举名 {
    枚举元素1,
    枚举元素2,
    ...
};

例如,我们定义了一个表示月份的枚举:

enum Month {
    January = 1,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
};

在这个枚举中,我们定义了12个元素,分别表示从1月到12月的月份。

我们可以通过以下方式定义一个Month类型的变量m:

enum Month m = January;

我们也可以通过以下方式访问枚举中的元素:

printf("当前月份为:%d\n", m);

输出结果为:当前月份为:1。

联合

联合是一种用户自定义的数据类型,它允许我们在一个数据块中存储不同的数据类型。联合中所有成员共享同一块内存,但只能同时存放其中的一个成员。

联合的定义方式如下:

union 联合名 {
    类型1 成员名1;
    类型2 成员名2;
    ...
};

例如,我们定义了一个联合,用于存储整型和浮点型数据:

union MyUnion {
    int i;
    float f;
};

在这个联合中,我们定义了两个成员:整型成员i和浮点型成员f。

我们可以通过以下方式定义一个MyUnion类型的变量u:

union MyUnion u;
u.i = 10;
printf("整型成员的值为:%d,浮点型成员的值为:%f\n", u.i, u.f);
u.f = 3.14;
printf("整型成员的值为:%d,浮点型成员的值为:%f\n", u.i, u.f);

执行上面的代码,输出结果为:

整型成员的值为:10,浮点型成员的值为:10.000000
整型成员的值为:1078523331,浮点型成员的值为:3.140000

我们可以看到,联合中的不同成员可以共用同一块内存,但只有其中一种类型是有意义的,其他类型的值都是未定义的。

示例

结构体示例

我们可以通过结构体来定义复杂数据类型。例如,我们定义一个学生的数据类型:

struct Student {
    char name[20];
    int age;
    char gender;
    float score;
};

我们可以通过以下方式定义一个Student类型的变量s,并访问其中的成员:

struct Student s = {"小红", 20, 'F', 90.5};
printf("姓名:%s,年龄:%d,性别:%c,分数:%f\n", s.name, s.age, s.gender, s.score);

输出结果为:姓名:小红,年龄:20,性别:F,分数:90.5。

枚举示例

枚举常用于状态码等场景。例如,我们定义一个表示http状态码的枚举:

enum HttpStatusCode {
    OK = 200,
    BadRequest = 400,
    NotFound = 404,
    InternalServerError = 500
};

我们可以通过以下方式定义一个HttpStatusCode类型的变量code,并访问其中的值:

enum HttpStatusCode code = OK;
printf("Http状态码:%d\n", code);

输出结果为:Http状态码:200。

联合示例

联合可以用于存储不同类型的数据。例如,我们定义一个联合,用于存储颜色的RGB值:

union RGB {
    int value;
    struct {
        unsigned char r;
        unsigned char g;
        unsigned char b;
    } color;
};

在这个联合中,我们定义了一个整型成员value和一个结构体成员color,其中color成员包含三个无符号字符类型的成员r、g、b,分别表示红、绿、蓝三个通道的亮度。

我们可以通过以下方式设置RGB联合的值,并访问其中的成员:

union RGB rgb;
rgb.color.r = 255;
rgb.color.g = 0;
rgb.color.b = 0;
printf("RGB值为:%d\n", rgb.value);

执行上面的代码,输出结果为:RGB值为:16711680。

总结

通过本文,我们介绍了C语言中的自定义类型:结构体、枚举和联合。结构体可以用于定义复杂的数据类型,枚举常用于状态码等场景,联合可以用于存储不同类型的数据。这些自定义类型在C语言的开发中有着广泛的应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中的自定义类型之结构体与枚举和联合详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言版医院管理系统

    C语言版医院管理系统攻略 介绍 C语言版医院管理系统是一个完整的医院管理系统,可以实现包括病人信息管理、医生信息管理、医院排班管理、医生出诊信息管理、病历管理等多项功能。该系统可以实现对医院各种资源和信息的自由管理,方便医院管理人员的工作。 系统需求 操作系统:Windows或Linux C语言编译器:gcc或VS 操作说明 1. 运行程序 下载并解压缩医院…

    C 2023年5月23日
    00
  • Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    以下是详细讲解“Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序”的完整攻略。 简介 在实现Android系统的过程中,需要通过内核驱动程序来实现硬件设备的访问和控制,而在开发内核驱动的过程中需要进行测试。本文将介绍如何在Ubuntu操作系统上测试Android系统的内核驱动程序。 步骤 1. 在Ubuntu操作系统中搭建开…

    C 2023年5月23日
    00
  • C++中基类和派生类之间的转换实例教程

    C++中基类和派生类之间的转换实例教程 什么是基类和派生类呢? 在C++中,基类和派生类是面向对象编程中的两个基本概念。基类通常是一个抽象的概念,它定义了一些通用的特征,在派生类中被继承和扩展。派生类则是从基类派生出来的类,它继承了基类的特性,并在此基础上增加了一些自己的特性。 转换示例 我们来看一个实际的示例,假设现在我们有一个基类People,和一个派生…

    C 2023年5月22日
    00
  • 浅析Lua编程中的异常处理

    浅析Lua编程中的异常处理 异常处理是一种非常重要的编程实践,它可以让我们更好地处理代码中可能出现的错误,提高程序的健壮性。在Lua编程中,异常处理同样非常重要而且也非常容易实现,本文将会对Lua编程中的异常处理进行浅析。 try-catch 在Lua中,我们可以使用try-catch结构来捕获异常。try语句块中包含可能会出现异常的语句,当其中的某个语句发…

    C 2023年5月23日
    00
  • C语言实现2D赛车游戏的示例代码

    下面我将详细讲解如何实现一个简单的2D赛车游戏。 1. 实现思路 首先,我们需要了解游戏的基本组成部分: 游戏场景 赛车模型 道路模型 背景音乐 操作控制 根据以上组成部分,我们可以总体将实现思路分为以下几个步骤: 创建画布:使用某种绘图库创建基础画布,用于绘制游戏场景。 绘制游戏场景:在基础画布上绘制游戏所需的场景元素,包括道路和赛车模型。 添加背景音乐:…

    C 2023年5月23日
    00
  • C# XML与Json之间相互转换实例详解

    C# XML与Json之间相互转换实例详解 本文将详细讲解在C#中如何实现XML与Json之间的相互转换。 1. XML转Json实例 首先我们需要引入System.Xml和Newtonsoft.Json两个命名空间,代码如下: using System.Xml; using Newtonsoft.Json; 我们首先需要创建一个XML文档,然后将其转换成J…

    C 2023年5月23日
    00
  • C语言 定位未使用的结构和结构成员

    要定位 C 语言程序中未使用的结构和结构成员,需要使用一个工具:GCC 的 -Wunused 选项,该选项可以用来开启未使用的警告。 开启未使用的警告 使用 GCC 的 -Wunused 选项,编译器会把未使用的结构和结构成员识别出来并发出警告。可以通过下面的命令来开启未使用的警告: gcc -Wunused <source_file> 开启未使…

    C 2023年5月9日
    00
  • C++设置系统时间及系统时间网络更新的方法

    C++设置系统时间及网络更新的方法 1. 设置系统时间 在C++中,可以使用time.h头文件中的time()函数获取当前时间,并使用set_time()函数设置系统时间。具体的代码如下: #include <iostream> #include <ctime> #include <windows.h> using nam…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部