详解C语言结构体,枚举,联合体的使用

详解C语言结构体、枚举、联合体的使用

C语言的结构体、枚举、联合体是三种比较重要的数据类型,可以在程序中方便地实现复杂的数据结构和算法。本文将从基本概念入手,详细介绍它们的定义、初始化、访问、应用等方面,帮助读者深入理解它们的使用方法。

结构体

定义

结构体是由若干个不同类型的数据成员组合而成的一个数据类型,可以表示一个具有复杂内部结构的数据。结构体由 struct 关键字定义,其语法如下:

struct struct_name {
    data_type1 member1;
    data_type2 member2;
    ...
    data_typen membern;
};

其中 struct_name 为结构体名称,member 为数据成员,其类型可以是任何合法的数据类型。注意,在结构体定义末尾要加上分号。

初始化

结构体可以用花括号 {} 对其成员进行初始化。例如:

struct person {
    char name[20];
    int age;
};

struct person p = {"Tom", 18};

这样就定义了一个名为 p 的结构体,其中 name 成员被初始化为 "Tom"age 成员被初始化为 18

访问

访问结构体成员需要用到 . 运算符。例如:

struct person p = {"Tom", 18};
printf("The name is %s, the age is %d.\n", p.name, p.age);

这样就可以将 p 结构体的成员 nameage 分别访问并打印。

示例

下面是一个使用结构体的示例,定义了一个电影的信息:

#include <stdio.h>
#include <string.h>

struct movie {
    char title[50];
    char director[20];
    int year;
    float rating;
};

int main() {
    struct movie m;
    strcpy(m.title, "The Shawshank Redemption");
    strcpy(m.director, "Frank Darabont");
    m.year = 1994;
    m.rating = 9.3;
    printf("%s (%d)\nDirected by %s\nIMDB rating: %.1f\n", m.title, m.year, m.director, m.rating);
    return 0;
}

枚举

定义

枚举是由一组有名值常量组成的数据类型,用于表示一些特定的取值范围。枚举由 enum 关键字定义,其语法如下:

enum enum_name {
    value1,
    value2,
    ...
    valuen
};

其中 enum_name 为枚举类型名称,value 为枚举常量名称,如果没有为枚举常量指定值,则从 0 开始自动编号,依次递增。

初始化

枚举常量可以单独使用,也可以和整数类型数据进行转换。例如:

enum weekday {Mon, Tue, Wed, Thu, Fri, Sat, Sun};
enum month {Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

int main() {
    enum weekday today = Fri;
    printf("Today is %d\n", today);
    int tomorrow = (int)Sat;
    printf("Tomorrow is %d\n", tomorrow);
    return 0;
}

这样定义了两个枚举类型:weekday 表示一周的七天,month 表示一年的十二个月,其中 Jan 的常量值为 1,后面的常量值依次递增。然后通过 todaytomorrow 变量分别来保存 FriSat 常量,并进行输出。

示例

下面是一个使用枚举的示例,通过枚举类型来表示一幅彩色图像的像素深度:

#include <stdio.h>

enum pixel_depth {mono = 1, gray = 8, rgb = 24, rgba = 32};

int main() {
    enum pixel_depth pd = rgb;
    switch (pd) {
        case mono:
            printf("Monochrome image\n");
            break;
        case gray:
            printf("Grayscale image\n");
            break;
        case rgb:
        case rgba:
            printf("Color image\n");
            break;
        default:
            printf("Unsupported image\n");
            break;
    }
    return 0;
}

联合体

定义

联合体是一种特殊的数据类型,可以使用相同的存储空间来表示不同的数据类型。联合体由 union 关键字定义,其语法如下:

union union_name {
    data_type1 member1;
    data_type2 member2;
    ...
    data_typen membern;
};

其中 union_name 为联合体名称,member 为数据成员,其类型可以是任何合法的数据类型。联合体的内存大小等于其最大成员的大小。

初始化

联合体同样可以使用花括号 {} 来初始化。例如:

union number {
    int i;
    float f;
};

union number n = {3.14};

这样就定义了一个名为 n 的联合体,其中只初始化了 f 成员,其值为 3.14。但是,由于结构体和联合体的成员是共用内存的,所以输出 i 成员时得到的结果可能会是错误的。

访问

和结构体一样,可以通过 . 运算符访问联合体的成员。但是,在一个特定的时间内,只有一个成员是活动的(有效的),如果访问了其中任何其他成员,则可能会导致数据损坏。例如:

union number {
    int i;
    float f;
};

union number n;
n.i = 5;
printf("%d %.2f\n", n.i, n.f);  // Output: 5 0.00
n.f = 3.14;
printf("%d %.2f\n", n.i, n.f);  // Output: 1078523331 3.14

这样定义了一个名为 n 的联合体,然后访问了其 i 成员和 f 成员,得到了两个不同的结果。这是因为,浮点型数值存储的方式和整型数值存储的方式不同,所以会导致数据有误。

示例

下面是一个使用联合体的示例,实现了一个转换整数和浮点数的函数:

#include <stdio.h>

union number {
    int i;
    float f;
};

void convert(union number n, char type) {
    if (type == 'f') {
        printf("%f\n", n.f);
    }
    else if (type == 'i') {
        printf("%d\n", n.i);
    }
}

int main() {
    union number n;
    n.f = 3.14;
    convert(n, 'f');
    convert(n, 'i');
    return 0;
}

结论

结构体、枚举、联合体是C语言中强大的数据类型,它们提供了方便地组织和处理复杂数据的方式。本篇文章详细介绍了它们的定义、初始化、访问、应用等方面,相信读者已经掌握了它们的使用方法。希望读者在开发中能够充分发挥它们的作用,提高代码的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C语言结构体,枚举,联合体的使用 - Python技术站

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

相关文章

  • C&C++设计风格选择 命名规范

    C/C++设计风格选择 什么是代码风格 代码风格是指编写代码时所遵循的规范和习惯,它涉及到如下几个方面: 命名规则(变量名、函数名、常量名等) 缩进和布局(tab还是空格、括号位置等) 注释规则(注释的格式、位置等) 代码组织(使用头文件、源文件等) 恰当的代码风格可以使程序更加清晰明了,便于日后的维护和修改。 C/C++代码风格 C/C++是一种老牌编程语…

    C 2023年5月23日
    00
  • Qt数据库应用之实现通用数据库分页

    一、引言 Qt是一款非常成熟和强大的GUI开源框架,有着丰富的组件库和强大的跨平台特性。作为一名Qt开发者,我们常常需要涉及数据库操作,而数据库分页是许多应用的常见需求。因此,本文将带领读者实现通用数据库分页的功能。 二、实现思路 在实现通用数据库分页功能,我们需要考虑以下几个问题: 如何统计数据库表的总记录数? 如何在Qt中实现查询特定记录范围的功能? 如…

    C 2023年5月22日
    00
  • C语言实现经典扫雷小游戏的示例代码

    下面我将为您提供C语言实现经典扫雷小游戏的示例代码的完整攻略。 准备工作 在开始编写代码之前,需要准备好以下工作: 确定游戏的规则和难度等级; 准确计算雷区的总大小、雷数等信息; 确定游戏界面的元素,例如雷区的格子、计时器、分数等; 使用C语言编写代码所需的IDE和编译器等工具。 编写代码 下面是基于C语言实现经典扫雷小游戏的示例代码: #include &…

    C 2023年5月23日
    00
  • C语言实现万年历源码

    以下是详细的“C语言实现万年历源码”的完整攻略,包括示例说明: 1. 确定需求 首先,我们需要确定要实现一个什么样的功能,比如万年历。在确定需求后,我们需要考虑要用到哪些关键的功能模块,比如日期计算、月份输出等等。 2. 设计数据结构 在确定需要的功能模块后,我们需要设计合适的数据结构来存储相关信息,比如保存日期信息的结构体等。 3. 编写代码 在设计好数据…

    C 2023年5月23日
    00
  • 面向对象三大特性的意义讲解

    面向对象编程中的三大特性分别是封装、继承和多态,下面我将逐一进行讲解。 封装 封装是将数据和方法包装在一起,形成一个不可分割的整体,对外界进行隐藏。这样可以控制数据被外部直接访问的情况,从而保证数据的安全性和可靠性。比如在Java中,我们可以使用private关键字修饰一个属性或方法,来实现封装。示例代码如下: public class Person { p…

    C 2023年5月22日
    00
  • FGO伊丽莎白巴陶里怎么样 C龙娘详细分析

    FGO伊丽莎白巴陶里怎么样 C龙娘详细分析 伊丽莎白巴陶里 伊丽莎白巴陶里(以下简称伊丽莎白)是一名SR级从者,属性为从者女性/恶魔。她在游戏中具有比较全面的能力,可以作为团队中的输出和支援,同时还拥有较高的生存能力。 技能分析 歌唱自由 (自身):提升自身攻击力(3宝石)和获得星星(5-10颗),持续3回合。该技能可以大幅提升伊丽莎白的输出能力,同时也可以…

    C 2023年5月23日
    00
  • C语言的基本编写规范你了解吗

    C语言的基本编写规范 C语言作为一门被广泛应用于系统编程、嵌入式编程等领域的编程语言,具有良好的可移植性、效率和灵活性,在编写C语言程序时,遵循基本的编写规范可以提高程序的可读性和可维护性。 以下是C语言的基本编写规范: 1. 文件命名规范 C语言源文件的文件名通常以“.c”结尾,头文件以“.h”结尾。文件名应该简单明了,避免使用中文、特殊字符和空格等,建议…

    C 2023年5月23日
    00
  • 简单实现C++复数计算器

    下面是详细讲解“简单实现C++复数计算器”的完整攻略: 简介 本文介绍如何使用C++语言编写一个基本的复数计算器。在此过程中,我们将学习C++的一些基础知识,例如:类和对象、运算符重载、头文件的使用等。 复数数学是一种有趣的数学概念,它包含有实数、虚数、复数等多种不同的数值类型。在本文中,我们将通过定义一个名为Complex的类来实现一个复数计算器。 复数的…

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