C语言自定义类型详解(结构体、枚举、联合体和位段)

yizhihongxing

C语言自定义类型详解

C语言中自定义类型是构建代码结构的关键组成部分。一个程序中定义的自定义类型,可以用来描述程序中的状态和数据,使程序更加清晰和易于维护。C语言中的自定义类型有结构体、枚举、联合体和位段等。
本文将为大家详细讲解C语言中这四种自定义类型的使用和应用场景。

结构体

定义结构体

结构体是用于存储多个不同数据类型的变量的自定义类型。例如,一个保存学生信息的结构体可以包含学生的姓名、学号和成绩等信息。
定义结构体的语法如下:

struct [结构名]
{
    [成员列表];
};

其中[结构名]是可选的,如果省略,则可以在后续定义变量时指定结构体成员,并直接使用。[成员列表]是由一个或多个成员组成的列表,每个成员由类型和名称组成,中间用空格隔开。例如:

struct student
{
    char name[20];
    int id;
    float score;
};

上述结构体定义了一个名为“student”的结构体,包含三个成员:一个20字节的字符数组“name”表示学生姓名,一个整型“id”表示学号,一个单精度浮点数“score”表示成绩。

访问结构体成员

定义结构体后,就可以通过结构体变量来访问其成员,语法如下:

[结构名].[成员名]

例如,要访问名为“student”的结构体变量“stu”的成员“id”,可以这样写:

struct student stu;
stu.id = 10001;

结构体变量的初始化

结构体变量的初始化方式有两种:第一种是在定义结构体变量时进行初始化,例如:

struct student stu = {"Tom", 10001, 89.5};

第二种是在定义结构体时指定初始值,例如:

struct student stu = {.name = "Tom", .id = 10001, .score = 89.5};

枚举

枚举是一种用于定义由常量值组成的类型的自定义类型。例如,一个描述星期的枚举类型可以包含星期一到星期日七个常量。定义枚举的语法如下:

enum [枚举名]
{
    [枚举列表];
};

其中[枚举名]是可选的,如果省略,则可以在后续定义变量时指定枚举成员,并直接使用。[枚举列表]是由一个或多个枚举成员组成的列表,每个成员由名称和常量值组成,中间用等号隔开。例如:

enum week
{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
};

上述枚举定义了一个名为“week”的枚举类型,包含七个成员,分别是星期一到星期日,常量值从1到7。其中枚举成员“Tue”从“Mon”的常量值(1)开始加1,依次类推。如果不指定枚举成员的常量值,则从0开始,依次加1。

访问枚举成员

访问枚举成员的方式和访问结构体成员类似,语法如下:

枚举变量 = [枚举名].[枚举成员]

例如,要将星期五赋值给枚举变量“day”,可以这样写:

enum week day;
day = Fri;

联合体

联合体是一种特殊的结构体,它的所有成员占用同一块内存空间。联合体中只有一个成员可以被同时使用,而其他成员则需要先被显式地初始化或赋值,才能使用。定义联合体的语法如下:

union [联合体名]
{
    [成员列表];
};

其中[联合体名]是可选的,如果省略,则可以在后续定义变量时指定联合体成员,并直接使用。[成员列表]是由一个或多个成员组成的列表,每个成员由类型和名称组成,中间用空格隔开。例如:

union data
{
    int num;
    float f;
    char str[20];
};

上述联合体定义了一个名为“data”的联合体,包含三个成员:一个整型“num”表示整数,一个单精度浮点数“f”表示浮点数,一个20字节的字符数组“str”表示字符串。

访问联合体成员

由于联合体中所有成员占用同一块内存空间,因此只能访问最后一次赋值或初始化的成员。访问联合体成员的方式和访问结构体成员类似,语法如下:

[联合体名].[成员名]

例如,要将整型变量“n”赋值给联合体变量“d”的成员“num”,可以这样写:

union data d;
int n = 100;
d.num = n;

位段

位段是一种用于定义一组由几个二进制位组成的数据存储结构的自定义类型。位段可以减小内存占用量,提高空间利用率。定义位段的语法如下:

struct [结构名]
{
    [成员列表]
    [位段列表]
};

其中[成员列表]和[结构名]与结构体的定义相同,[位段列表]则是一个或多个位段成员,由类型、名称和位段长度组成,中间用冒号隔开。例如:

struct flags
{
    unsigned int bit1 : 1;
    unsigned int bit2 : 2;
    unsigned int bit3 : 3;
};

上述位段定义了一个名为“flags”的结构体,包含三个成员,分别是长度为1的无符号整型“bit1”、长度为2的无符号整型“bit2”和长度为3的无符号整型“bit3”。

访问位段成员

访问位段成员的语法和访问结构体成员类似,例如:

struct flags f;
f.bit1 = 1;
f.bit2 = 2;
f.bit3 = 5;

上述代码将位段成员“bit1”赋值为1,将位段成员“bit2”赋值为2,将位段成员“bit3”赋值为5。

示例说明

示例1

以下是一个使用结构体的例子,定义了一个存储矩形信息的结构体,并计算了矩形的面积。

#include <stdio.h>

struct rectangle
{
    float width;
    float height;
};

int main()
{
    struct rectangle rect;
    rect.width = 3.0;
    rect.height = 4.0;
    float area = rect.width * rect.height;
    printf("The area of the rectangle is %f\n", area);
    return 0;
}

输出结果为:

The area of the rectangle is 12.000000

示例2

以下是一个使用枚举的例子,定义了一个星期的枚举类型,并输出星期一的常量值。

#include <stdio.h>

enum week
{
    Mon = 1,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
};

int main()
{
    printf("The constant value of Monday is %d\n", Mon);
    return 0;
}

输出结果为:

The constant value of Monday is 1

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

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

相关文章

  • MySQL中多个left join on关联条件的顺序说明

    在 MySQL 的多个 LEFT JOIN 操作中,我们需要在 ON 子句中指定关联条件。正确顺序的设置可以有效优化查询性能,同时保证关联结果的正确性。 如何设置关联条件的顺序?我们可以遵循以下步骤: 从主表开始,其余表按照查询的依赖关系顺序连接。 对于非主表,保证其实际关联的表能够尽早地被筛选,有效缩小数据集的范围,减少查询所需的时间。 为了更好的理解这个…

    C 2023年5月22日
    00
  • C++中Boost.Chrono时间库的使用方法

    下面我来为你详细讲解一下C++中Boost.Chrono时间库的使用方法。 什么是Boost.Chrono时间库? Boost.Chrono是Boost库中的一个子库,提供了一组可移植的、高精度的时间操作的函数和类。Boost.Chrono可以帮助程序员处理时间相关的操作,主要有以下三个方面的作用: 用于测量程序的时间性能,比如计算程序运行的时间。 帮助程序…

    C 2023年5月23日
    00
  • C++趣味算法之侦探推理

    C++趣味算法之侦探推理攻略 游戏说明 「侦探推理」是一款经典的数学推理游戏,需要通过推理和判断,找出隐藏在谜题中的答案。而本篇文章将教大家利用C++编程实现这个游戏,并提供完整攻略。 游戏规则 游戏中,有5位嫌疑犯和5个证人,他们在房间内,相互之间发生了一些事情。现在,我们知道有3个嫌疑犯和2个证人的事情发生了,需要利用已知条件推理出真正的罪犯和证人。 五…

    C 2023年5月22日
    00
  • 详解C语言结构体,枚举,联合体的使用

    详解C语言结构体、枚举、联合体的使用 C语言的结构体、枚举、联合体是三种比较重要的数据类型,可以在程序中方便地实现复杂的数据结构和算法。本文将从基本概念入手,详细介绍它们的定义、初始化、访问、应用等方面,帮助读者深入理解它们的使用方法。 结构体 定义 结构体是由若干个不同类型的数据成员组合而成的一个数据类型,可以表示一个具有复杂内部结构的数据。结构体由 st…

    C 2023年5月22日
    00
  • C++虚函数及虚函数表简析

    C++虚函数及虚函数表简析 虚函数 在C++中,通过将类中的某个成员函数定义为虚函数,使得该成员具有多态性质。当我们通过指向派生类对象的基类指针或引用调用虚函数时,实际上会根据这个指针或引用所指向的对象类型,动态地调用该类的对应虚函数,而不是调用基类中定义的虚函数。 虚函数的定义格式如下: class Base { public: virtual void …

    C 2023年5月22日
    00
  • 使用c++编程实现简单的打字小游戏

    下面是使用C++编程实现简单的打字小游戏的完整攻略: 1. 游戏设计 首先,我们需要设计这个小游戏的基本玩法和功能。这个小游戏的基本玩法就是要求玩家在规定的时间内输入尽可能多的单词。具体实现过程如下: 随机生成一个单词,并将其存储在一个字符串中; 将这个字符串输出到屏幕上,并等待玩家的输入; 获取玩家输入的字符串,并将其与生成的单词进行比较,看输入是否正确;…

    C 2023年5月23日
    00
  • 电脑使用小技巧集合

    电脑使用小技巧集合攻略 简介 本文是一份电脑使用小技巧集合攻略。通过学习本攻略,你可以更好地使用电脑,更快捷地完成各项工作和任务。本攻略共包含以下内容: 快捷键的使用; 系统设置的优化; 常用软件的小技巧。 快捷键的使用 快捷键可以减少鼠标的使用,提高工作效率。以下是常用的一些快捷键: 快捷键 功能 Ctrl + C 复制 Ctrl + X 剪切 Ctrl …

    C 2023年5月22日
    00
  • C语言中回调函数的使用详情

    回调函数是一种应用程序设计模式,通常在C语言中使用,用于将一个函数传递给另一个函数,以便后者在特定条件下调用前者。回调函数可以极大地提高程序的可扩展性和复用性。在这里,我们将详细讨论回调函数的使用方法,简单介绍一下回调函数的概念和用途,最后提供两个示例说明。 回调函数的概念和用途 回调函数是指在作为参数传递给另一个函数的函数。简单来说,回调函数是由另一个函数…

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