C的温故而知新:结构和其他数据形式(C Primer Plus第十四章)

news2025/1/20 3:51:24

第十四章:结构和其他数据形式

在我们使用语言进行程序编程设计的时候,经常会出现很多复杂的数据,,每到这种时候,就需要创建很多的变量去存储各种各类的数据。还有一种情况,不同类型的数据是相互关联的,这就需要将它们关联的放到关联的数据变量中。如果是企业JAVA开发的话,有可能是将其放到数据库之中,再或者使用JSON数据格式进行获取或者解析。但是在C语言中,有一些复杂的数据结构。本章主要是介绍这些数据存储形式。

结构:声明结构

struct book{
    char title[LENTH];
    char author[LENTH];
    float value;
}

此时,结构布局告诉编译器该结构如何去表示数据,但是还没有为数据分配空间。创建结构变量的时候才会分配数据空间

struct book library;

访问结构成员的话,使用点(.)访问结构中的成员。.比&的优先级高。

如果使用结构数组的话,要注意栈内存溢出问题。

struct book libraary[LENTH];

调用数组成员时:

library[2].value;//调用数组中第三个结构的value值
library[2].title[4];//调用数组中第三个结构的title字段中的第五个字符

此外,结构中还可以嵌套另一个结构,还存在指向结构的指针,像这样

struct book * it;
it = &threeBody;

和数组不同的是,结构变量名并不是结构变量的地址,因此要在结构变量名前面加上&运算符。使用指针访问成员的时候,有两种方法,可以使用->运算符,也可以使用*解引用运算符。需要注意的是,这里必须要用括号,因为.运算符的优先级比*高。

it->author;//相当于threeBody.author
(*it).author;//因为(*it)相当于*(&threeBody),也就是threeBody

接下来,就可以像使用数组或者变量一样,去使用结构进行函数之间的通信了,这里就不多赘述了。思考一下选择结构或者结构指针的时机。结构指针呢,执行起来比较快,而且只需要一个地址,缺点是无法保护数据,被调函数中的某些操作可能会意外的影响原来结构中的数据。除非加上const运算符。对于结构呢,老版本的实现可能无法处理这样的代码,传递结构比较浪费时间和存储空间。尤其是传递了一个较大的结构,但是它只使用了结构中的一两个成员。

在结构中,也可以使用malloc()函数和free()函数,创建一个合适的存储空间,将指针放到结构中,注意要在合适的位置对空间进行释放。

伸缩性数组成员:伸缩性数组成员必须是结构的最后一个成员;结构中必须至少有一个成员;伸缩数组的声明类似于普通数组,只是方括号中是空的。此外,不能用结构进行赋值和拷贝;不要以按值方式把这种结构传递给函数。要把结构的地址传给函数。不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。

此外,还有很多种结构的使用方式,匿名结构,在函数中使用结构数组,将结构内容保存到文件之中。这里就不一一的说了。大多是用到了先前学的内容。

联合:一种数据类型,可以在一个存储空间中存储不同的数据类型(不是同时存储),主要是为了存储混合类型的数据

union hold{
    int digit;
    double bigfl;
    char letter;
}

hold可以存储一个int类型的值或者一个double类型的值或者一个char类型的值。联合只能存储一个值。可以使用点运算符去表示使用哪种类型。

union hold fit;
fit.digit; = 23;

枚举:声明符号名称来表示整形常量。使用enum关键字。

enum spectrum {red, orange, yellow, green, blue, violet};
enum spectrum color;

第一个声明创建了spetrum作为标记名,第二个声明创建了color作为该类型的变量。枚举值的默认值是从零开始的常量,当然也可以为其赋值,如果只给一个枚举常量赋值的话,后面的枚举常量会被赋予后续的值。

typedef:typedef是一个高级数据特性,利用其可以为某一类型自定义名称,与#define类似,不同的是,typedef创建的符号名只受限于类型,不能用于值;由编译器解释,不是预处理器;在受限范围内,typedef比#define更灵活。typedef为经常出现的复杂类型创建一个方便、易识别的类型名。其并没有创建新类型,只是为已存在的类型创建一个方便的标签。

*表示一个指针,()表示一个函数,[]表示一个数组,()和[]的优先级相同,且比*高,从左到右结合,所以不同的组合下会创建很多不同的复杂类型,还有接下来的指向函数的指针。看看书上的例子,自行理解一下吧。我们后续会通过编程练习来看一下这块内容的具体运用。

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过 MATLAB 的 cylinder 函数生成圆柱体的表面坐标,生成表示一个具有非标准形状的圆柱体(在本例中是杯子)

MATLAB的机器人系统工具箱(RST)的官方例程Plan a Reaching Trajectory with Multiple Kinematic Constraints规划具有多个运动学约束的到达轨迹 % 创建用于视觉化杯子的点 [X,Y,Z] cylinder(cupRadius*linspace(0,1,50).^0.125); % 调整 Z 坐标的比例…

element-plus form 表单嵌套表格树单行校验问题

需要实现这样的效果&#xff0c;单行校验表格树 公共方法可以直接用 const findPosi (tree, targetId, path "") > {for (let i 0; i < tree.length; i) {const node tree[i];if (node.id targetId) {return path i;}if (node.sub_parameters &&a…

网站服务包含哪些

网站服务是指一系列通过互联网提供的服务&#xff0c;涵盖了多个方面&#xff0c;从基本的网站建设到更高级的在线业务解决方案。以下是网站服务可能包含的一些主要方面&#xff1a; 网站设计与开发&#xff1a; 网站设计&#xff1a; 包括整体网站结构、用户界面设计、图形设…

一、插件开发入门【Qt环境-mingw6.5.3-qmake版】-封装dll调用

1.先创建一个名为mainProject的主项目,并进行简单的ui布局 2.使用C Library库创建动态库项目作为主项目的子插件 2.1 Qt模块选择为Widgets 2.2 环境配置和主项目要一致 3.给插件添加qt界面设计类 4.给subPlugin插件添加一个名为PluginInterface.h的头文件 #ifndef PLUGININTERF…

软件设计师全套备考系列文章8 -- 查找、排序

软考-- 软件设计师&#xff08;8&#xff09;-- 查找、排序 文章目录 软考-- 软件设计师&#xff08;8&#xff09;-- 查找、排序前言一、查找二、排序三、排序的评价指标&#xff08;重点&#xff09; 前言 考试时间&#xff1a;每年5月、11月&#xff0c;软件设计师每年都会…

湖南 | 产能利用率高达80%的龙头砼企如何进行站内外高效配合

走进标杆企业 走进标杆企业&#xff0c;感受名企力量&#xff0c;探寻学习优秀企业领先之道。本期要跟砼行们推介的标杆企业是湖南省新宁县鑫旺混凝土有限公司。 鑫旺混凝土有限公司成立于2012年&#xff0c;建有三条混凝土生产线&#xff0c;自有水泥、砂石骨料、房地产等一…

vue3 中 defineProps 和 defineEmits

在 Vue 3 中&#xff0c;defineProps 和 defineEmits 是组合式 API 的核心功能&#xff0c;用于处理父子组件之间的传值和事件通信。 1. defineProps defineProps 用于定义并接收父组件传递过来的数据&#xff08;props&#xff09;。它是在子组件中使用的&#xff0c;接收的…

100000在银行存个3年利息居然12000

python存款利息问题 设计一个函数来计算存款利息。存款利息由存款金额和存款时间决定。 如果存款金额小于或等于5000元&#xff0c;则年利率为2%;5000元到10000元之间&#xff0c;则年利率为3%;大于10000元&#xff0c;则年利率为4%。返回本金和利息 def getMoney(amount,yea…

44.开发商购买土地

44.开发商购买土地 &#xff08;用到了前缀和的知识&#xff09; 题目链接 //卡码网题号44.开发商购买土地 #include<iostream> #include<vector> #include<climits> using namespace std;int main() {int n, m;int sum0;cin >> n >> m;vector…

stable-diffusion-webui容器构建教程

一、介绍 Stable Diffusion WebUI 是一个提供了易于使用的 AI 绘画工具&#xff0c;它允许用户通过一个更友好、可视化的网页界面来与 Stable Diffusion 模型互动&#xff0c;可以实现文生图、图生图等。 二、特点 易于使用的界面 &#xff1a;用户可以通过网页界面进行操作…

【数据同步】SeaTunnel初体验,5000字深入浅出带你用上Oracle-CDC

Apache SeaTunnel 是啥&#xff1f;下一代高性能、分布式、海量数据集成框架。支持上百个数据源、传输速度快、准确率高&#xff0c;丰富易扩展的连接器和插件化的连接器设计&#xff0c;能够更轻松的运行复杂的集成。是一个分布式、高性能的数据集成平台&#xff0c;用于数据迁…

USB Type-C如何取9V、12V、15V、20V电压-PD快充协议芯片ECP5701

相信大家在生活中也发现了&#xff0c;现在越来越多的设备都改用这种type-C接口的母座进行取电了。 因为欧盟决议 &#xff1a;自2024年起部分消费电子产品必须提供单一的USB-C充电接口。 那么这种type-C接口相比之前的Micro-B接口有着一个很大的优势就是可以有更高的电压&…

部署同步工具syncthing

1、下载包arm包&#xff08;根据自己的环境下载包&#xff09; #进到指定目录 cd /usr/local/ #可以根据自己的环境下载不同版本的包 wget https://github.com/syncthing/syncthing/releases/download/v1.27.10/syncthing-linux-arm64-v1.27.10.tar.gz2、进行部署 #将其解压 …

接口参数与文档||关于淘宝商品·订单数据API接口的功能达成经验分享

电商数据采集有5种方式&#xff0c;包括API、RPA、数据库连接、Excel下载和ERP等业务系统数据采集。这些方法可帮助卖家获取多平台电商数据&#xff0c;进行深度挖掘&#xff0c;实现电商运营的优化。 电商竞争白热化的今天&#xff0c;一个电商卖家往往会在多个平台铺设店铺来…

Flutter Web 正式官宣弃用 HTML renderer , Canvas 路线成为唯一

Flutter Web 团队计划在 2025 年的第一个 Flutter stable 版本中弃用 HTML renderer&#xff0c;当然在 master 和 beta 中会更早合并这一更改。 关于这个话题&#xff0c;其实在年初的我就曾发布过 《Flutter 即将放弃 Html renderer 》&#xff0c; Html renderer 从 2018 年…

狗都能看懂的Swin Transformer的讲解和代码实现

文章目录 1、Swin-Transformer介绍2、模型整体框架3、Patch Mergeing详解4、W-MSA模块详解MSA模块计算量W-MSA模块计算量 5、SW-MSA详解6、Relative Position Bias详解7、模型详细配置参数 1、Swin-Transformer介绍 自从ViT&#xff08;Vision Transformer&#xff09;出现之后…

腾讯软件测试岗二面:web 测试问题被虐哭了,直到学长给了我这些知识点.....

web 测试一直是大厂软件测试问到的一个重点&#xff0c;下面给大家展示下大厂关于web 测试经常会问到的一些问题&#xff0c;以及解析。看当面试官问到你这些问题的时候&#xff0c;你是否也能够对答如流。 web 测试面试真题及解析&#xff1a; 一&#xff0c;描述用浏览器访问…

SQL基础——函数与约束

声明&#xff1a;以下内容为根据黑马数据库视频教程&#xff0c;个人整理的笔记&#xff0c;方便记录学习。 SQL基础之函数与约束 知识导图案例SQL语句编写一、函数1.字符串函数2.数值函数3.日期函数4.流程函数 二、约束 知识导图 案例SQL语句编写 一、函数 1.字符串函数 A.…

用工业操作系统鸿道Intewell可以玩黑神话悟空吗?

黑神话悟空的爆火&#xff0c;让我想到&#xff0c;工业操作系统鸿道Intewell是否可以玩黑神话悟空&#xff1f; 鸿道Intewell操作系统是面向工业控制领域的操作系统&#xff0c;它支持实时和非实时应用在同一个硬件平台上运行&#xff0c;并且能够保留Windows开发环境的同时部…

平衡二叉树(AVLTree)

1.平衡二叉树的定义 1.1 什么是平衡二叉树 平衡二叉树&#xff0c;又称AVL树&#xff0c;用于解决二叉排序树高度不确定的情况&#xff0c;如果二叉排序树的子树间的高度相差太大&#xff0c;就会让二叉排序树操作的时间复杂度升级为O(n)&#xff0c;为了避免这一情况&#x…