【C语言指南】数据类型详解(下)——自定义类型

             💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C语言指南》

                                  期待您的关注

 

47f09392526c71b5885ec838a3ea7ffe.gif

 

目录

引言

1. 结构体(Struct)

2. 联合体(Union)

3. 枚举(Enum,自定义用法的高级特性)

4. 类型定义(Typedef)

结语


C语言内置类型可参考上一篇文章:

【C语言指南】数据类型详解(上)——内置类型-CSDN博客

 

引言

在C语言中,除了丰富的内置数据类型外,自定义数据类型也是编程中不可或缺的一部分。自定义数据类型允许程序员根据实际需求定义新的数据类型,从而提高代码的可读性、可维护性和复用性。

 

本文将详细探讨C语言中几种常见的自定义数据类型结构体(Struct)联合体(Union)枚举(Enum,侧重于其自定义用法的高级特性)以及类型定义(Typedef),并对每种类型的定义、使用场景、注意事项及高级特性进行详细说明。

1. 结构体(Struct)

结构体是C语言中一种复合数据类型,它允许将不同类型的数据项组合成一个单一的类型

结构体是用户自定义类型的基础,广泛应用于表示具有多个属性的复杂对象。

  • 定义

    struct Student {  
        char name[50];  
        int age;  
        float score;  
    };
     

    这里定义了一个名为Student的结构体,包含三个成员:name(字符数组,用于存储学生姓名)、age(整型,用于存储学生年龄)和score(浮点型,用于存储学生成绩)。

  • 使用
    定义结构体类型后,可以使用该类型声明变量,并通过点运算符(.)访问其成员。

    struct Student stu1;  
    strcpy(stu1.name, "Alice");  
    stu1.age = 20;  
    stu1.score = 92.5f;
  • 高级特性

    • 结构体数组:可以定义结构体数组,以存储多个具有相同结构的数据项。
    • 结构体指针:结构体指针用于指向结构体变量或结构体数组,通过结构体指针可以动态地访问和修改结构体成员。
    • 结构体嵌套:结构体中可以包含其他结构体作为成员,实现更复杂的数据结构。

 

2. 联合体(Union)

联合体是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。

联合体主要用于节省内存空间或在某些特定情况下共享数据。

  • 定义

    union Data {  
        int i;  
        float f;  
        char str[20];  
    };
     

    这里定义了一个名为Data的联合体,包含三个成员:i(整型)、f(浮点型)和str(字符数组)。但需要注意的是,这些成员在同一时刻只能使用其中一个,因为它们共享同一块内存空间。

  • 使用
    使用联合体时,必须明确当前使用的是哪个成员,因为联合体的所有成员都从相同的内存地址开始。

    union Data data;  
    data.i = 10; // 使用整型成员  
    // 注意:在访问其他成员之前,必须确保该成员是最后被赋值的,否则可能导致数据不一致  
    printf("%d\n", data.i); // 输出10  
    data.f = 3.14f; // 使用浮点型成员,此时整型成员的值将被覆盖  
    printf("%f\n", data.f); // 输出3.14

     

  • 高级特性

    • 匿名联合体:在某些情况下,可以定义匿名联合体,以便直接访问其成员而无需通过联合体名。
    • 联合体的内存对齐:由于联合体成员共享同一块内存,因此联合体的总大小通常等于其最大成员的大小,但实际的内存布局可能受到编译器和平台的影响,特别是与内存对齐有关。

 

3. 枚举(Enum,自定义用法的高级特性)

枚举类型是一种用户定义的类型,它包含一组命名的整型常量

虽然枚举本质上不是自定义数据类型(因为它基于整型),但其自定义用法和高级特性使得它非常强大。

  • 定义

    enum Color { RED, GREEN, BLUE, YELLOW, COUNT };
    这里定义了一个名为Color的枚举,包含四个颜色常量和一个计数常量COUNT
    (通常用于表示枚举中常量的数量)。默认情况下,枚举常量的值从0开始递增。
    
  • 自定义值
    可以为枚举常量指定具体的整数值。

    enum Color { RED = 1, GREEN = 2, BLUE = 4, YELLOW = 8, COUNT = 4 };
    注意这里的COUNT被赋值为4,它并不代表枚举中常量的总数,而是被显式赋值为4。
    
  • 高级特性

    • 枚举的位字段:结合位运算,可以使用枚举来表示一组可以组合的属性。
    • 枚举的类型安全:虽然枚举在C语言中是基于整型的,但它们提供了比整数更好的类型安全性,因为枚举常量具有明确的语义。
    • 枚举的跨平台问题:由于枚举的底层类型是整型,其大小和范围可能因编译器和平台而异,因此在跨平台编程时需要注意。

 

4. 类型定义(Typedef)

typedef关键字用于为现有的数据类型定义一个新的名字(别名)。

使用typedef可以简化复杂的类型声明,提高代码的可读性。

  • 定义

    typedef struct {  
        int x, y;  
    } Point;
    这里为包含两个整型成员x和y的结构体定义了一个新类型名Point。
    
  • 使用
    现在可以使用Point来声明变量,而无需每次都写struct关键字。

    Point p1, p2;  
    p1.x = 10;  
    p1.y = 20;
  • 高级特性

    • 类型安全的别名typedef不仅简化了类型声明,还提供了类型安全的别名,有助于防止类型混淆。
    • 函数指针的简化typedef特别适用于简化函数指针的类型声明,使得回调函数和函数指针的使用更加直观。

 

结语

自定义数据类型是C语言中强大的特性之一,它们允许程序员根据实际需求定义新的数据类型,从而创建出更加灵活、高效和易于维护的程序。

通过深入理解并掌握这些自定义数据类型的定义、使用场景、注意事项及高级特性,程序员可以编写出更加优秀的C语言程序。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/885614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】ID3、C4.5、CART 算法

目录 常见的决策树算法 1. ID3 2. C4.5 3. CART 决策树的优缺点 优点: 缺点: 决策树的优化 常见的决策树算法 1. ID3 ID3(Iterative Dichotomiser 3)算法使用信息增益作为特征选择的标准。它是一种贪心算法,信…

Python 课程20-Scikit-learn

前言 Scikit-learn 是 Python 中最流行的机器学习库之一,它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者,都可以借助它进行快速原型设计和模型开发。 在本教程中&a…

PFC和LLC的本质和为什么要用PFC和LLC电路原因

我们可以用电感和电容的特性,以及电压和电流之间的不同步原理来解释PFC(功率因数校正)和LLC(谐振变换器)。 电感和电容的基本概念 电感(Inductor): 电感是一种储存电能的组件。它的电流变化比较慢,电流在电感中延迟,而电压变化得比较快。可以把电感想象成一个“滞后…

Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]

cifar10 准确率只有0.1 问题描述踩坑解决办法 问题描述 如果你看的是北京大学曹健老师的tensorflow2.0,你在class5的部分可能会遇见这个问题 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout,MaxPooling2D,Fla…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL69

脉冲同步器(快到慢) 描述 sig_a 是 clka(300M)时钟域的一个单时钟脉冲信号(高电平持续一个时钟clka周期),请设计脉冲同步电路,将sig_a信号同步到时钟域 clkb(100M&…

长文本溢出,中间位置显示省略号

1.说明 Flutter支持在文本末尾显示溢出省略号。现在想要实现在文本中间位置显示省略号,这里使用的方法是通过TextPainter计算文本宽度。(我目前没有找到更好的方法,欢迎大家指教。) 2.效果 源码 1.MiddleEllipsisTextPainter …

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点:支持IPv4 提供高精版、…

TypeScript 算法手册 【数组基础知识】

文章目录 1. 数组简介1.1 数组定义1.2 数组特点 2. 数组的基本操作2.1 访问元素2.2 添加元素2.3 删除元素2.4 修改元素2.5 查找元素 3. 数组的常见方法3.1 数组的创建3.2 数组的遍历3.3 数组的映射3.4 数组的过滤3.5 数组的归约3.6 数组的查找3.7 数组的排序3.8 数组的反转3.9 …

深度学习常见术语介绍

文章目录 数据集(Dataset)特征(Feature)标签(Label)训练集(Training Set)测试集(Test Set)验证集(Validation Set)模型(Mo…

什么是文件完整性监控(FIM)

组织经常使用基于文件的系统来组织、存储和管理信息。文件完整性监控(FIM)是一种用于监控和验证文件和系统完整性的技术,识别用户并提醒用户对文件、文件夹和配置进行未经授权或意外的变更是 FIM 的主要目标,有助于保护关键数据和…

【NVIDIA】如何使用nvidia-smi命令管理和监控GPU

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Golang | Leetcode Golang题解之第436题寻找右区间

题目: 题解: func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…

面向人工智能: 对红酒数据集进行分析 (实验四)

由于直接提供截图是不切实际的,我将详细解释如何使用scikit-learn(通常称为sk-learn)自带的红酒数据集进行葡萄酒数据的分析与处理。这包括实验要求的分析、数据的初步分析(完整性和重复性)以及特征之间的关联关系分析…

MATLAB绘图基础9:多变量图形绘制

参考书:《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 9.多变量图形绘制 9.1 气泡图 气泡图用于展示三个或更多变量变量之间的关系,气泡图的组成要素: 横轴( X {\rm X} X轴):表示数据集中的一个变量&#xff0c…

双端搭建个人博客

1. 准备工作 确保你的两个虚拟机都安装了以下软件: 虚拟机1(Web服务器): Apache2, PHP虚拟机2(数据库服务器): MariaDB2. 安装步骤 虚拟机1(Web服务器) 安装Apache2和PHP 更新系统包列表: sudo apt update安装Apache2: sudo apt install apache2 -y安装PHP及其Apac…

只写CURD后台管理的Java后端要如何提升自己

你是否工作3~5年后,发现日常只做了CURD的简单代码。 你是否每次面试就会头疼,自己写的代码,除了日常CURD简历上毫无亮点可写 抱怨过苦恼过也后悔过,但是站在现在的时间点回想以前,发现有很多事情我们是可以做的更好的。…

Spring之生成Bean

Bean的生命周期:实例化->属性填充->初始化->销毁 核心入口方法:finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26 1. LLMs Still Can’t Plan; Can LRMs? A Preliminary Evaluation of OpenAI’s o1 on PlanBench Authors: Karthik Valmeekam, Kaya Stechly, Subbarao Kambhampati LLMs仍然无法规划;LRMs可以…

Mybatis的基本使用

什么是Mybatis? Mybatis是一个简化JDBC的持久层框架,MyBatis是一个半自动化框架,是因为它在SQL执行过程中只提供了基本的SQL执行功能,而没有像Hibernate那样将所有的ORM操作都自动化了。在MyBatis中,需要手动编写SQL语…

【Android】布局优化—include,merge,ViewStub的使用方法

引言 1.重要性 在Android应用开发中,布局是用户界面的基础。一个高效的布局不仅能提升用户体验,还能显著改善应用的性能。随着应用功能的复杂性增加,布局的优化变得尤为重要。优化布局能够减少渲染时间,提高响应速度&#xff0c…