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++ 实现比较日期大小之前,我们需要了解以下基础概念:时间戳和结构体。 时间戳是指自 1970 年 1 月 1 日 00:00:00 UTC 至现在的总秒数。在 C++ 中,我们可以使用 time_t 类型来表示时间戳。 结构体是由一系列不同类型的数据组成的自…

    C 2023年5月23日
    00
  • 教你如何使用PHP输出中文JSON字符串

    下面是“教你如何使用PHP输出中文JSON字符串”的完整攻略: 1. 什么是JSON 在开始讲解如何使用PHP输出中文JSON字符串之前,我们需要先理解JSON是什么。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,大部分现代编程语言都支持解析和生成JSON数据。它基于JavaScript语言的子集,并且易于阅读和…

    C 2023年5月23日
    00
  • C++控制结构详情

    C++控制结构详情 概述 C++控制结构是编程过程中非常重要的一部分,它决定了程序如何执行、流程如何转移。C++语言中常用的控制结构包括:条件语句、循环语句、跳转语句等。 条件语句 if语句 if语句是最基本的条件语句,用于根据条件进行分支控制。 if语句的语法格式为: if (condition) { // 条件成立时执行的代码 } 例如,下面的示例代码用…

    C 2023年5月30日
    00
  • PHP生成及获取JSON文件的方法

    这里为你详细讲解 PHP 生成和获取 JSON 文件的方法,包括示例说明。 一、生成 JSON 文件 生成 JSON 文件非常简单,我们只需要使用 PHP 的 json_encode() 函数将数据格式化为 JSON 字符串,再将其写入到文件中即可。 // 创建 PHP 数组 $data = array( ‘name’ => ‘Tom’, ‘age’ …

    C 2023年5月23日
    00
  • C++类中如何使用定义的类型别名

    在C++中,我们可以使用typedef或using关键字来定义类型别名。然后,我们可以在类中使用定义好的类型别名,以方便代码的编写和维护。 以下是使用typedef关键字在类中定义和使用类型别名的示例: typedef int myInt; class MyClass { public: void setNum(myInt num) { m_num = nu…

    C 2023年5月23日
    00
  • c++11 atomic的使用详解

    下面是关于”C++11 atomic的使用详解”的完整攻略。 什么是atomic atomic是一个C++11标准中的类模板,可用于实现原子操作。原子操作是一种不可分割的操作,要么成功执行,要么不执行,不会被其他线程中断。使用atomic可以确保并发访问下的线程安全。 基础用法 atomic支持内部类型如int、long等的原子操作。下面是一些基本的示例: …

    C 2023年5月22日
    00
  • C++实现学生管理系统

    C++实现学生管理系统攻略 简介 学生管理系统是一种基于计算机的学生信息管理工具,用于维护学生的基本信息、成绩等数据。C++是一种广泛使用的编程语言,可用于构建学生管理系统。 实现步骤 步骤一:定义类和结构体 在开始编写代码之前,需要先定义类和结构体,以便在后续步骤中使用。在此示例中,我们定义了一个名为 “Student” 的类,该类包含学生的姓名、性别、年…

    C 2023年5月23日
    00
  • 在python 脚本下解析json数据

    在Python脚本中解析JSON数据需要使用Python内置的json库,它提供了loads()和dumps()两个方法,分别用于JSON数据的解析和生成。 以下是完整的攻略步骤: 1. 导入json库 在Python脚本中解析JSON数据,需要先导入json库: import json 2. 使用loads()方法解析JSON数据 loads()方法可以将…

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