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

yizhihongxing

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/C++ 宏详细解析 什么是宏? 宏是C/C++中的一种预处理器指令,它是一种简单的文本替换机制。在编译程序之前,预处理器将源代码中的宏替换为预定的文本,并将这个结果传递给编译器,编译器再将其编译成二进制代码。 宏定义语法格式为: #define 常量 表达式 常量和表达式之间要留有空格,常量名通常用大写字母表示,并且不需要加分号。 如何使用宏? 示例一:…

    C 2023年5月23日
    00
  • snprintf函数的用法解析

    让我来向你介绍一下snprintf函数的用法解析。 什么是snprintf函数 snprintf是一个C库函数,用于格式化字符串并将结果输出到指定缓冲区。与printf函数不同的是,snprintf在输出的同时将结果存储在指定缓冲区中。它可以避免缓冲区溢出,因为在输出到缓冲区之前已经设置了输出的最大长度。 该函数的原型为: int snprintf(char…

    C 2023年5月22日
    00
  • C++生成随机数的实现代码

    生成随机数是C++编程中常常需要使用到的功能之一,C++标准库提供了一些库函数可以实现生成随机数的功能,下面我将详细讲解“C++生成随机数的实现代码”的完整攻略: 使用rand()函数生成随机数 rand()函数是C++标准库提供的用于生成随机数的函数。使用rand()需要包含头文件。 设置随机数种子 要想生成真正的随机数,必须先设置不同的随机数种子,否则每…

    C 2023年5月24日
    00
  • C#正则表达式判断输入日期格式是否正确

    为了使用正则表达式判断输入日期格式是否正确,我们需要编写一个匹配日期格式的正则表达式,然后将要检查的日期与该正则表达式进行匹配。以下是一个完整的攻略: 1. 编写匹配日期格式的正则表达式 正则表达式是一个由一系列字符和操作符组成的模式。它可以用来匹配文本中的特定模式。要编写匹配日期格式的正则表达式,我们可以根据日期格式的规则来构建。以下是一个匹配 “yyyy…

    C 2023年5月23日
    00
  • 第一个C 程序

    下面为大家详细讲解”第一个C程序”的完整使用攻略。 了解C语言编程环境 C语言是一种编写高性能、可移植的系统软件和应用程序的通用编程语言,具有高效性和灵活性等优点。因此C语言已成为计算机科学教育的基础,并被广泛应用于操作系统、数据库、网络、嵌入式系统等领域。 在使用C语言进行编程前,需要安装C语言编译器,例如Windows系统上的Visual Studio、…

    C 2023年5月9日
    00
  • Javascript对象属性方法汇总

    Javascript对象属性方法汇总 在Javascript中,对象是一种基本数据类型,它可以用来存储数据和方法。一个对象可以包含多个属性和方法,属性是对象的状态,方法是对象的行为。本文将总结Javascript中常见的对象属性和方法。 对象属性 对象属性描述对象的状态,包括数据属性和访问器属性两种。 数据属性 数据属性描述对象的简单值,包含以下属性: va…

    C 2023年5月22日
    00
  • Python的Bottle框架中返回静态文件和JSON对象的方法

    Python的Bottle框架是一个轻量级的Web框架,它提供了Web开发的核心功能,如路由、请求、响应等功能。Bottle框架还提供了返回静态文件和JSON对象的方法,下面我们就来详细讲解一下。 返回静态文件 在Bottle框架中,可以使用static_file函数来返回静态文件。该函数的原型如下: def static_file(filename, ro…

    C 2023年5月23日
    00
  • Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space

    Python 字符串处理中的特殊空格包括非换行空格(Non-breaking space)、制表符(Tab)和换行符(Newline)。在字符串处理中,这些特殊空格可能会对文本处理和分析造成一定的影响。 非换行空格 非换行空格通常是由于文本的格式化处理而产生的,它可以通过 Unicode 编码表中的字符 \xc2\xa0 表示。在 Python 中,可以通过…

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