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

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日

相关文章

  • golang分层测试之http接口测试入门教程

    我来详细讲解“golang分层测试之http接口测试入门教程”的完整攻略。该攻略包括以下几个部分: 1.前置知识 在学习golang分层测试之http接口测试之前,需要掌握一些基础知识,包括但不限于: Golang基础语法 RESTful API基本概念 Http协议 JSON数据格式 2.环境搭建 在进行http接口测试之前,需要搭建一套测试环境。可以从以…

    C 2023年5月23日
    00
  • 解析C++哈夫曼树编码和译码的实现

    解析C++哈夫曼树编码和译码的实现 前言 哈夫曼树是一种经典的数据结构,常用于数据压缩和编解码等场景。其中,哈夫曼树的编码和译码是哈夫曼编码最核心的两个操作。 本篇文章将详细讲解如何使用C++实现哈夫曼树的编码和译码,包括以下内容: 哈夫曼树的构建 哈夫曼编码的生成 哈夫曼编码的压缩 哈夫曼编码的解压 哈夫曼树的构建 哈夫曼树的构建需要先计算出每个字符出现的…

    C 2023年5月24日
    00
  • C语言与C++中内存管理详解

    C语言与C++中内存管理详解 内存管理是C语言和C++中非常重要的一部分,正确的内存管理可以避免内存泄漏和内存溢出等问题,从而提高程序的稳定性和性能。本文将详细介绍C语言和C++中的内存管理技巧和注意事项。 内存分配和释放 在C语言和C++中,内存分配和释放是通过动态内存管理函数来实现的。C语言中的动态内存管理函数包括malloc()、calloc()和re…

    C 2023年5月22日
    00
  • JavaScript对象拷贝与Object.assign用法实例分析

    JavaScript对象拷贝与Object.assign用法实例分析 在JavaScript编程中,对象拷贝是一项非常重要的任务,因为我们经常需要在代码中使用对象,但由于JavaScript对象的引用特性,往往原始对象会被误修改或者无意间影响其他部分代码,这时候需要做对象拷贝,保持数据的安全完整性。JavaScript的标准库提供了多种深复制或浅复制对象的拷…

    C 2023年5月22日
    00
  • C++ pimpl机制详细讲解

    C++ pimpl机制详细讲解 什么是pimpl机制 pimpl,即Private Implementation(私有实现),也叫Opaque Pointer(不透明指针),是一种C++编程技巧/设计模式,它的本质是把类的实现(类的成员变量和方法)隐藏到源文件中,只把类的接口(类的公有成员函数)暴露出去。 pimpl机制的优缺点 优点: 隐藏了类的实现细节,…

    C 2023年5月22日
    00
  • C++ 系统String类详解

    C++ 系统String类详解 引言 在 C++ 语言中,字符串 (String) 是一种非常常见的数据类型。在使用中,我们可以选择使用系统默认提供的String类,也可以选择使用第三方库提供的字符串类库。本文将详细讲解C++系统String类以及其相关使用技巧。 String类简介 String类是C++标准库中提供的一个数据类型,定义在头文件 中。Str…

    C 2023年5月30日
    00
  • C++程序操作文件对话框的方法

    现在我将为大家介绍一下在C++程序中操作文件对话框的方法。操作文件对话框是一个常用的功能,它可以帮助我们在程序中以交互式的方式选择文件并进行相关操作。下面是该攻略的详细步骤: 1. 确定操作系统类型 在编写代码之前,我们需要确定我们所使用的操作系统类型,不同的操作系统可能具有不同的文件对话框API接口。下面是Windows和macOS操作系统下涉及到的API…

    C 2023年5月23日
    00
  • C语言和嵌入式C的区别

    C语言和嵌入式C的区别 C语言和嵌入式C虽然在语法上很相似,但是它们的使用场景和目标不同。 C语言 C语言是一种通用的高级编程语言,它广泛应用于计算机软件开发、操作系统、网络编程等领域。C语言在设计时的主要目的是为Unix操作系统提供高效的底层编程语言,与Unix操作系统紧密结合,在计算机领域已经有40多年的历史。 C语言不依赖于任何特定系统或机器,代码可以…

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