当前位置: 首页 > news >正文

C语言学习记录(13)自定义类型:结构体

一、结构体变量的声明、创建和初始化

1.结构体变量的声明

结构体变量我们学操作符的时候就顺带讲了一点了,因为当时讲了结构体成员变量访问操作符'.'。

结构体变量不像int、float这种内置类型的,一旦创建,系统就知道这是干啥的,结构体变量是那种我们想要在一个个体中存在多个变量用来储存数据所用的。也可以说是对我们要用的一系列变量的封装,全部装到一个结构体中。

比如我们之前所举例的:

对于一个学生个体,我们想要得到他的名字成绩和学号等变量。

一般的:

struct tag

{

member-list;

}variable-list;

tag是给成员变量起的名字,member-list是成员变量包括哪些类型,variable-list可以定义全局变量(也可以不写)。

这些我们都非常熟悉了。

你可以在成员列表就创建变量,也可以什么时候用什么时候创建。

2.匿名结构体变量的声明

如:

不带tag的结构体变量就被称为匿名结构体变量,对于这种结构体只适用于在创建完结构体以后,在成员列表里立刻创建变量(如果你在后面又想用这个类型你想想如果光写struct,你想的是去调用这个匿名的struct,但是编译器直接就凌乱了,一个文件有一大堆struct,它就是识别你是个struct,然后对照tag就知道你要求的到底是什么,匿名结构体很明显找不到tag),才能使用,所以一般只用于临时使用。

再次强调,匿名结构体编译器再找就找不到这个结构体了,因为他是根据tag来辨认的,除非你直接在成员列表里创建变量,变量名我们知道肯定是唯一的,顺着变量名就能找到对应的结构体。

3.typedef对结构体变量进行重命名

在学习指针的时候,比如函数指针了,int (*)(int,int)这是一个两个整型的参数,返回值为int的一个指向函数的指针,非常长,如果复用性很强的话,我们就会进行typedef重命名,使得调用这个类型的变量更加方便。

结构体的命名如:struct Stu你每次定义变量都得struct Stu s1必须完整打出来这是一个结构体变量,哪个结构体呢?tag为Stu的结构体,假如需要重复定义就会非常麻烦。

所以这个时候就可以借助typedef来重命名。

①严格遵守typedef的格式

typedef的标准语法为:

typedef 原始类型 新类型名;

如typedef int i;typedef char ch;当然,内置类型都不需要进行重新定义,它们的格式已经十分简洁,但是对于结构体,比如:

这个可就比较长了,如果typedef,标准格式为:

严格按照typedef的语法来,即将struct Stu(原始类型)重命名为Stu(新类型名)

之后就可以借助Stu来建立类型为struct Stu的变量了。

②结构体特殊typedef类型

这是什么意思呢?

可以这么理解,一旦加了typedef,它就会疯狂的可以说是扫描吧,看看typedef后面跟的原始类型到底是什么,一看,哦,是一个结构体,struct包括了int age;float score;int id[20]等变量;最后跟的Stu就是新类型名,这里可以理解为定义了一个结构体,结构体的名字就是Stu。

如果这样定义一定不要省去Stu,否则会报错,因为不给Stu相当于不给新类型名,那么这个时候不符合typedef的语法。

注意区分

首先知道,如果为①这种类型的定义,你在后面定义的时候,既可以写struct Stu,也可以只写Stu,这里的Stu相当于别名;而②所给的相当于①的简化,struct Stu和Stu结果是一样的。

然后不要想着②的Stu明明在成员列表里,为什么不是一个成员变量呢,反而就可以成为别名。你如果写了typedef struct,这个时候编写程序就要求你把别名放到成员列表里,这个时候的Stu就是别名的意思。

当然,C语言的代码允许你一次写好几个别名,即如果你写:

有typedef在场的情况下Stu,s1,s2都是这个结构体的别名。但是实际在编写代码的时候不太推荐这么做,因为如果你这么写了,Stu还好,毕竟有意义,后面给的s1,s2很容易造成你后面编写代码,或者交由其他人继续编写的时候存在名称的冲突。

最后,再强调一下,typedef在场的情况下,成员列表的所有逗号分隔开的值认为都是这个结构体的别名,这个只有struct的时候(无论是不是匿名结构体),欣然当作创建了几个变量。

4.结构体变量的创建和初始化

上面说了这么多,可算把结构体变量的声明说完了,有了结构体变量以后我们就要借助我们定义的别名来创建结构体变量及给其初始化。

之前其实讲.操作符的时候已经说过了,这里给个图片展示。

犯抽抽了,我搞得时候把学号写成int类型的数组了,你当成int,计算机只会把你给的这个数当成你初始化第一个元素,然后因为太长int存不起来,你肯定会存在越界(单int类型不是数组存更完蛋,直接成乱码了,因为存不下),越其它元素的界,检查了检查把id这个数组改成char类型的就可以用" "来初始化,系统会一个一个数字的存,初始化方便了,打印直接%s也方便了。

5.结构体的自引用

学完C语言就该学习数据结构了,数据结构有线性结构了,树状结构了等,其中有一个东西就叫做链表。

我们学过的数组它的每个元素在内存中是连续存放的,而链表它的元素在内存中不一定是连续存放的,一般是用结构体定义的变量,一个存值,一个存下一个元素的指针。

画图来理解是这样的:

就像这样:

有一错误写法应该避免:

就是说这种情况下,是怎么想的呢?

我得存一个值,还得存下一个元素,这样肯定不对,不妨计算一下struct Node这个结构体的大小,发现会一直套娃下去,根本算不出来大小,所以最方便的还是存下一个链表元素的地址。

注意:

在typedef时要注意结构体定义的细节。

匿名结构体肯定是不行的,代码是一句一句执行的,你如果以一个匿名结构体方式重命名Node,在重命名前就要使用,所以名字不能省:

由此又警醒我们,匿名结构体千万不能乱用,如果要用就老老实实结构体,结构体成员列表,最后创建几个结构体变量。

二、结构体内存对齐

1.引例

有很多东西都是非常严谨的,不是凭我们所学的一知半解就能明白。

比如:

请计算S1和S2的大小,有的人就会说,那还不简单。

S1 = 1 + 4 + 1

S2 = 1 + 1 + 4

都是6。

代码一走就sb脸了,一个6都没有,一个12,一个8。

这里介绍一个宏,offsetof。用的时候包含头文件<stddef.h>

第一个参数是结构体的名字,第二个参数是结构体的成员。

返回值是这个成员到这个结构体的偏移量,单位为字节。

返回值是什么意思呢?

结构体整个要开辟一段内存空间,而每个成员都占有一定的内存空间,计算这个成员内存起始点到结构体内存起始点的距离。

先用再画图,以S1为例:

S1总共占了12个字节,先画出来:

c1的偏移量是0,i的偏移量是4,c2的偏移量是8,花在图中是:

根据变量大小,可得:

蓝 绿 黄绿这几个就是结构体成员分别所占的内存空间大小,而黑色其实根本用不到,被浪费了。

大约摸好像能感觉到好像存的都像int类型,而int恰好是占内存最大的那个元素,不一定就是这个规则,但是可以猜一猜。

所以就是12个字节,这里我们其实是结果推本质,那本质到底是什么呢?

2.结构体的对齐规则

①结构体的第一个成员对齐到结构体变量的起始位置的偏移量为0的地址处(一句话,第一个变量顶格)

②其他变量对齐到对齐数的整数倍(对齐数位编译器和变量大小中较小的数)

vs中默认偏移量为8

③结构体总大小为最大对齐数(所有成员变量的大小中最大的对齐量)的整数倍

④如果嵌套了结构体,嵌套的结构体成员对齐量为自己成员中最大的对齐数的整数倍处,结构体整体大小仍是最大对齐数的整数倍(有结构体成员去它最大对齐数比较)

基于这样的规则我们就可以分析分析:

首先明确,下面画的图里面的数字都是偏移量,是一个相对值,相对结构体的起始内存地址

S1的图:

一样道理的S2和S3不再写注释:

S4:

S1和S2对比,一个小小的结论就是,把占内存较小的变量放在一起,可以节省结构体所占用的内存空间。

3.为什么要存在结构体内存对齐

有的人就要问了,主播主播,为什么就非得搞个什么内存对齐呢?

①平台原因

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

②性能原因

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要⼀次访问。

上面的都是复制粘贴,反正最主要的就是这个:

可移植性作以了解即可。

一句话,结构体的内存对齐是为了空间换时间。

4.修改默认对齐数

默认对齐数可以由一个预处理指令修改,#pragma

这么用:

默认对齐数是1怎么比对齐数都是1了,这个时候其实是取消了对齐。

可以通过

来取消(如果文件很大的话),文件小你注释或者删了都无所谓。

三、结构体传参

假如说打印一个非常非常大的结构体:

一个是传过去这个结构体变量,一个是传过去这个结构体变量的指针。

直接说结论,如果直接传变量,已经说过很多次了,传参是对你给的数据的临时拷贝,这个结构体占几千个字节,你搁栈区搞几千个字节;如果传指针,根据环境无非是4或8个字节,不用对结构体拷贝,直接找到结构体(如果嫌指针不安全就const)。

另外 ->是指针访问结构体成员操作符,我忘了之前说了没,这个就相当于(*ps).解引用得到一个结构体成员变量的位置,然后点访问。

其实挺直观的,箭头表示直接找到这个结构体成员。

四、结构体实现位段

1.对比位段和结构体

位段是育于结构体中的,但是位段的成员必须是整型,如int,unsigned int等;每个成员后都有冒号加数字。

举例:

第一个肯定是个结构体(变量名是字母数字下划线组成),第二个在变量定义的时候多了个冒号和数字。

结构体大小不多说,为什么A2就是8个字节呢?

位段位段,它的位的意思就是2进制位,将一个int类型的_a变量只给2个比特位,也就是说只能存 00 01 10 11即0 1 2 3(其实现实生活多的这种只需要存一个或两个数字,身份证男女就是),这样就省去了30个字节,其它的也同理。

初识我们了解到了一个点,位段是可以节省内存空间的。

2.位段的内存分配

位段空间一般以4个字节(int)和(char)类型开辟。

这个内存分配大概说说,假如这样吧:

这样的话内存肯定是一个一个字节申请的,然后这样的话碰见a取出来一个字节,用两个比特位,但是并不知道用的是低地址还是高地址,然后剩下了6个,碰见了b就再扣5个比特位,剩下一个肯定不够c用,但是不知道这个多的比特位是不用了还是继续给c用,然后在下一个申请的字节用三个还是既然不够了,索性四个比特位全放在新申请的。

我们之前学的大端小端字节序肯定只能试用正常申请一个int4个字节等的存储顺序方式,这个根本就是随机给的,C语言语法都没有明确规定。

总之,位段确实省空间,但是跨平台存在问题

3.位段的应用

位段(Bit-fields)在 C 语言中的应用非常广泛,特别是在硬件控制、嵌入式编程和通信协议中,因其能够提供位级别的控制,同时节省内存。下面是几个常见的位段应用场景:

①硬件编程和嵌入式系统

在硬件控制和嵌入式开发中,位段用于直接操作硬件寄存器。硬件寄存器通常由多个标志位组成,每个位控制一个特定的硬件特性。位段非常适合用来描述这些寄存器的状态。

② 网络协议和数据包解析

位段在通信协议中也有广泛应用。网络协议通常需要精确控制每一个标志位,用于标识消息的不同部分或状态。比如,IP 地址、数据包头部、标志字段等,很多情况下每个字段的大小并不等于字节,而是由多个位组成。

③文件格式与数据压缩

位段还经常用于一些特殊的文件格式或数据压缩算法中。这些文件格式要求数据存储和传输时尽可能节省空间。在文件头部或者数据结构中,很多时候会用到位段来表示不同字段的值。

④游戏开发与图形渲染

位段还可以用于游戏开发中的某些位图或图形数据结构。例如,表示像素的状态、颜色值或者图形的透明度时,可以使用位段进行高效存储。

这些都复制粘贴来的(问的ai),了解了解,万一用得上至少不一脸懵逼。

4.位段的注意事项

取地址的时候我们已经说了,取出来的都是某个变量的第一个字节的地址,而因为位段的原因,一个字节可能存多个变量的数据,这个时候就不能取地址。

如:

给这玩意输入可有福了,不能取地址那就不能用scanf,只能赋值,这里就创建了个变量承接输入的值并赋给它。

 

相关文章:

C语言学习记录(13)自定义类型:结构体

一、结构体变量的声明、创建和初始化 1.结构体变量的声明 结构体变量我们学操作符的时候就顺带讲了一点了&#xff0c;因为当时讲了结构体成员变量访问操作符.。 结构体变量不像int、float这种内置类型的&#xff0c;一旦创建&#xff0c;系统就知道这是干啥的&#xff0c;结…...

rtthread 软件SPI驱动, 支持mode0~3,MSB,LSB

rtthread的软件模拟SPI用的上层PIN驱动写&#xff0c;由于经过层层封装&#xff0c;时钟频率并不会太高&#xff0c;200MHz的MCU跑不到1MHz的时钟频率。所以最好是在底层就模拟好&#xff0c;给上层用。 头文件 struct io_poSOFT {gpio_type *port;uint16_t pin; }; typedef …...

C++自学笔记——动态创建对象

动态创建对象 1. 什么是动态创建对象&#xff1f; 在学习之前的知识点时&#xff0c;我们知道有静态存储期和自动存储期。 静态存储期的对象在程序的整个生命周期内都存在&#xff0c;全局变量和static修饰的局部变量都属于这一类。自动存储期的对象&#xff0c;这些对象在函…...

35.[前端开发-JavaScript基础]Day12-for循环中变量-华为商城-商品列表-轮播图

for循环中监听函数中打印变量 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…...

详细描述以太坊的gas、gaslimit、gasPrice

目录 一、Gas 是什么? ✅ 简要定义: 🧠 举例理解: 二、Gas Limit 是什么? ✅ 简要定义: 分两种: 举例说明: 三、Gas Price 是什么? ✅ 简要定义: 为什么它重要? 示例: 四、 EIP-1559 后的新机制(伦敦升级) 三个要素: 五、额外技巧(开发实用) 本文…...

【Java】Maven

一、概念 是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。 二、Maven坐标 <groupId>com.itheima</groupId><artifactId>maven-project01</artifactId>&…...

PageCache

目录 一、PageCache的具体过程 二、具体实现代码 一、PageCache的具体过程 页缓存主要解决的是内存外碎片问题&#xff0c;并且直接和系统调用打交道。 申请过程如下&#xff1a; 当中心缓存中没有内存时,会去页缓存申请一个span结构,要经过下面几步: &#xff08;1&#xf…...

Vue3实战五、面包屑,收缩菜单,高亮暗黑主题切换,全屏功能实现

目录 面包屑&#xff0c;收缩菜单&#xff0c;黑夜白夜样式,全屏功能实现收缩菜单按钮结合pinia功能实现第一步、定义布局配置的数据类型第二步、创建布局状态管理文件第三步、使用布局配置状态第四步、进行展开/收起左侧菜单逻辑第五步、动态切换左侧菜单宽度样式第六步、动态…...

Linux内核设计——(二)进程调度

目录 一、进程调度简介 二、多任务 三、调度器 3.1 I/O消耗型和处理器消耗型进程 3.2 进程优先级 3.3 CFS算法 3.4 实时调度策略 3.5 SCHED_FIFO 3.6 SCHED_RR 3.7 调度器入口 四、上下文切换 4.1 睡眠和唤醒 4.2 need_resched标志 4.3 用户抢占 4.4 内核抢占 一…...

【C++初阶】--- string类模拟实现

1.基础函数 1.1成员函数 成员函数主要是_str、_size、_capacity这三个。npos是size_t 的最大值,用于当作后续成员函数的参数的缺省值。 class string { private:char* _str nullptr;//指向字符串的指针size_t _size 0;//字符串长度size_t _capacity 0;//空间大小static c…...

Pythia 使用说明

Pythia 是一个由非营利研究组织 EleutherAI 开发的开源语言模型套件&#xff0c;专注于透明性和可复现性。它是为了推动自然语言处理&#xff08;NLP&#xff09;领域的开放研究而设计&#xff0c;尤其在模型训练过程和性能分析方面提供了详尽的文档和数据。 Pythia 的核心特点…...

python:获取某路径下所有图片的名称

可以使用 Python 的 os 模块或者 pathlib 模块来获取指定路径下所有图片的名称。以下是使用这两种方法实现的代码示例&#xff1a; 使用 os 模块 import osdef get_image_names_os(path):image_extensions (.jpg, .jpeg, .png, .gif, .bmp)image_names []for root, dirs, f…...

一个开源的 VS Code 大模型聊天插件:Light-at

这篇文章是一个开发杂谈。对于有经验的开发者来说&#xff0c;可能这个项目并不算特别复杂或者高技术&#xff0c;只是对我个人来说算一个里程碑&#xff0c;因此写篇杂谈文章记录一下。也许也能给起步者一些参考。 项目地址&#xff1a;https://github.com/HiMeditator/light-…...

图论学习笔记2

请先阅读图论学习笔记 1。 在这篇文章里&#xff0c;我们将继续以前 tarjan 求解的强连通分量和双连通分量&#xff0c;讲解其缩点相关内容。 也会讲解一些特殊的图&#xff1a;基环树与仙人掌图、最小树形图。 缩点 我们知道&#xff0c;将强连通分量、双连通分量缩点之后…...

蓝桥杯备赛---真题训练之15届省赛产品360度展示

题目 介绍 在电子商务网站中&#xff0c;用户可以通过鼠标或手势交互实现 360 度全方位查看产品&#xff0c;提升用户体验。现在需要你设计一个 Pipeline 管道函数&#xff0c;用于控制 360 度展示产品的动画序列&#xff0c;通过管道连接各个动画步骤&#xff0c;使产品以流畅…...

图论:单源最短路(BF算法+迪杰斯特拉算法+spfa算法)

单源最短路 概念 dijkstra实现&#xff08;解决不了负权值&#xff09; P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; - 洛谷 #include<iostream> #include<vector> #include<cstring> using namespace std;typedef pair<int, int> PII…...

嵌入式学习(35)-TTS语音模块FT-VBM-OS支持ModbusRTU

一、概述 FT-TTS-R-01 &#xff08;下简简“模块”&#xff09;是一款可将串口传入的文本信息转成语音播报的控制器。块”可下接收任意字 符或者汉字&#xff0c;并通过 TTS 语音合成功能&#xff0c;清晰、准确、自然的合成并播放音频。该块”还带有 1 路继电器输出&#xff0…...

【Vue-组件】学习笔记

目录 <<回到导览组件1.项目1.1.Vue Cli1.2.项目目录1.3.运行流程1.4.组件的组成1.5.注意事项 2.组件2.1.组件注册2.2.scoped样式冲突2.3.data是一个函数2.4.props详解2.5.data和prop的区别 3.组件通信3.1.父子通信3.1.1.父传子&#xff08;props&#xff09;3.1.2.子传父…...

Github上一些使用技巧(缩写、Issue的Highlight)自用

1. GIthub中的一些缩写 LGTM ! 最近经常看到一些迷之缩写&#xff0c;感觉挺有意思的&#xff0c;但是有时候看到一些没见过的缩写还是有点懵逼&#xff0c;不过缩写确实也是很方便去review&#xff0c;这里就记录汇总一下&#xff1b;顺便加了一些git的基操单词&#xff08;加…...

【团体程序涉及天梯赛】L1~L2实战反思合集(C++)

实战反思汇总记录 仔细审题&#xff0c;想好再写 L1-104 九宫格 - 团体程序设计天梯赛-练习集 易忽略的错误&#xff1a;开始习惯性地看到n就以为是n*n数组了&#xff0c;实际上应该是9*9的固定大小数组&#xff0c;查了半天没查出来 L1-101 别再来这么多猫娘了&#xff01…...

ubuntu下的node.js的安装

安装 node-v22.14.0-linux-x64.tar.xz 的步骤如下&#xff1a; 1. 下载和解压 如果尚未下载文件&#xff0c;可以通过 wget 下载&#xff08;替换为实际下载链接&#xff09;&#xff1a; wget https://nodejs.org/dist/v22.14.0/node-v22.14.0-linux-x64.tar.xz解压文件&…...

VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr

手把手虚拟机安装苹果操作系统 VMware_workstation_full_12.5.2 unlocker208 Apple Max OS X(M&#xff09;-CSDN博客 vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1180 FILE: FileCreateDirectoryRetry: Non-retriable error encountered (C:\ProgramData\VMware): Cann…...

Linux下创建svn库 和 svn安装与操作

1.介绍 SVN是Subversion的简称&#xff0c;是一个开放源代码的版本控制系统&#xff0c;相较于RCS、CVS&#xff0c;它采用了分支管理系统&#xff0c;它的设计目标就是取代CVS。适合中小公司的开发人员不多的项目使用,相比git管理工具更简单. 2.安装svn 2.1 国际惯例 首先看…...

React-04React组件状态(state),构造器初始化state以及数据读取,添加点击事件并更改state状态值

1.React组件状态&#xff08;state&#xff09; 组件可以拥有状态&#xff08;state&#xff09;&#xff0c;它是组件数据的私有部分&#xff0c;可以用来管理动态数据。状态仅适用于类组件&#xff0c;或者使用 React 的 Hook 时可以在函数组件中使用。 注意 组件中render方…...

第3课:MCP协议接口定义与开发实践

MCP协议接口开发实战&#xff1a;从标准化设计到跨语言SDK落地 一、引言&#xff1a;为什么接口标准化是多智能体协作的“刚需” 在多智能体系统中&#xff0c;不同语言开发的智能体、异构服务之间的通信效率往往受制于接口兼容性问题。MCP&#xff08;Model Context Protoco…...

Perl语言的WebAssembly

Perl语言的WebAssembly&#xff1a;将古老的语言带入新世纪 引言 在编程语言发展的历史长河中&#xff0c;Perl作为一门早期广泛使用的脚本语言&#xff0c;以其灵活性和丰富的文本处理能力而闻名。然而&#xff0c;随着互联网和Web技术的迅猛发展&#xff0c;许多开发者开始…...

[ISP] ISP 中的 GTM 与 LTM:原理、算法与与 Gamma 校正的对比详解

在现代图像信号处理&#xff08;ISP&#xff09;流水线中&#xff0c;图像增强是提升视觉质量的核心手段之一。尤其是在高动态范围&#xff08;HDR&#xff09;内容、弱光环境或复杂光照条件下&#xff0c;Tone Mapping&#xff08;色调映射&#xff09;技术的引入成为关键。To…...

健身管理小程序|基于java微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)

健身管理小程序目录 基于微信开发健身管理小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 小程序端&#xff1a; 后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码…...

批量将文本合并成单个文件,支持按文件夹合并文本文档

我们的文件夹中有零零碎碎的多个小的文本文件&#xff0c;这对我们存档记录是非常不方便&#xff0c;不友好的。如果我们能够将多个小的文本文件合并成一个完整的大的文本文件&#xff0c;那不管是在共享还是在存档起来都更加的方便。今天给大家介绍一下如何批量将多个文本文件…...

ROS云课三分钟-差动移动机器人巡逻报告如何撰写-中等报告

评语&#xff1a; 成绩中等&#xff08;70/100&#xff09;&#xff0c;具体如下&#xff1a; 1. 摘要部分 问题描述&#xff1a; 内容空洞&#xff1a;摘要过于简短&#xff0c;仅简要概述了研究内容和实现方法&#xff0c;未突出研究的创新点或重要性。缺乏细节&#xff1…...

forms实现推箱子小游戏

说明: forms实现推箱子小游戏 效果图&#xff1a; step0:游戏规则 # 推箱子游戏规则说明## &#x1f3af; 游戏目标 - 通过控制角色移动&#xff0c;将所有**棕色箱子(3)**推到**红色目标点(4)**上 - 当所有箱子都变为**绿色(7)**时&#xff0c;即完成当前关卡 - 完成全部关…...

图的储存+图的遍历

图的存储 邻接矩阵 #include <iostream>#include <cstring>using namespace std;const int N 1010;int n, m;int edges[N][N];int main() {memset(edges, -1, sizeof edges);cin >> n >> m; // 读⼊结点个数以及边的个数 for(int i 1; i < m; i)…...

蓝桥杯—数字接龙(dfs+减枝)

一.题目 二.思路 一看就是迷宫问题的变种&#xff0c;从左上角到达右下角&#xff0c;要解决 1.8个方向的方向向量&#xff0c;用dx&#xff0c;dy数组代表方向向量 2.要按照一个规律的数值串进行搜索0&#xff0c;1&#xff0c;2&#xff0c;k-1&#xff0c;0&#xff0c;1…...

Solidity智能合约漏洞类型与解题思路指南

一、常见漏洞类型与通俗解释 1. 重入攻击(Reentrancy) 🌀 通俗解释:就像你去银行取钱,柜台人员先给你钱,然后再记账。你拿到钱后立即又要求取钱,由于账还没记,柜台又给你一次钱,这样循环下去你就能拿走银行所有的钱。 漏洞原理:合约在更新状态前调用外部合约,允许…...

临床 不等于 医学-《分析模式》漫谈52

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第4章“企业财务观察”有这么一句话&#xff1a; An important point about this model——a reflection of its clinical background 2004&#xff08;机械…...

鸿蒙应用开发中的 Stack 布局模式

在鸿蒙(HarmonyOS)应用开发中&#xff0c;Stack 布局模式是一种非常灵活的布局方式&#xff0c;类似于其他开发框架中的 StackPanel 或 AbsoluteLayout。它允许子组件按照层级关系进行堆叠&#xff0c;后添加的组件会覆盖在先添加的组件之上。开发者可以通过设置组件的位置、大…...

仿modou库one thread one loop式并发服务器

源码&#xff1a;田某super/moduo 目录 SERVER模块&#xff1a; Buffer模块&#xff1a; Socket模块&#xff1a; Channel模块&#xff1a; Connection模块&#xff1a; Acceptor模块&#xff1a; TimerQueue模块&#xff1a; Poller模块&#xff1a; EventLoop模块&a…...

【AI学习】初步了解Gradio

Gradio 是一个开源的 Python 库&#xff0c;专注于快速构建交互式 Web 界面&#xff0c;特别适用于机器学习模型、数据科学项目或任意 Python 函数的演示与部署。它通过极简的代码实现前后端一体化&#xff0c;无需前端开发经验即可创建功能丰富的应用。以下是 Gradio 的核心特…...

C++11QT复习 (十四)

文章目录 Day9 数据结构学习笔记&#xff08;2025.04.01&#xff09;一、C基础快速回顾二、STL&#xff08;标准模板库&#xff09;三、常见容器及其对应的数据结构四、容器操作演示1. 基本容器使用2. 异构类型容器 五、迭代器详解特点示例用户自定义结构体访问成员 六、算法库…...

ThreadCache

目录 一、Freelist 二、ThreadCache 三、哈希桶映射规则 一、Freelist 在之前整体框架介绍的时候&#xff0c;我们曾说过ThreadCache是一个哈希桶的结构。每一个桶都要存同一个大小的对象块&#xff08;即最小块的内存&#xff09;。 那么我们使用FreeList来…...

c++中同步和异步,阻塞和非阻塞原理以及机制

在C中&#xff0c;同步与异步、阻塞与非阻塞是并发编程中的重要概念&#xff0c;它们描述了程序在执行任务时的行为模式。理解这些概念对于设计高效、响应良好的并发程序至关重要。下面我将详细介绍这些概念的原理和机制。 1. 同步与异步 同步&#xff08;Synchronous&#x…...

Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案

前言 前段时间做一个内网开发的需求&#xff0c;要求将selenium程序打包成.exe放在内网的win7上运行&#xff0c;在掘金搜了一圈也没有发现相关文章&#xff0c;因此将过程中踩到的坑记录分享一下。 本文涵盖了具体打包操作、不同模块和依赖项的兼容性解决方案&#xff0c;以…...

浅谈微信视频号推荐算法

这次可能会稍微有点干货&#xff0c;但保证不晦涩~ 一、算法推荐的本质&#xff1a;猜你喜欢 vs 社交绑架​ 视频号的推荐系统本质上在做两件事&#xff1a; ​预测你的兴趣​&#xff1a;通过你的浏览、点赞、评论、分享等行为&#xff0c;分析你的偏好。​满足社交需求​&…...

selenium 常用方法

selenium 库的常用方法&#xff1a; 方法说明示例代码webdriver.Chrome()初始化 Chrome 浏览器实例。driver webdriver.Chrome()driver.get(url)访问指定的 URL 地址。driver.get("https://example.com")driver.find_element(By, value)查找第一个匹配的元素。elem…...

springboot中使用async实现异步编程

目录 1.说明 2.实现原理 3.示例 4.总结 1.说明 Async 是 Spring 框架提供的一个注解&#xff0c;用于标记方法为异步执行。被标记的方法将在调用时立即返回&#xff0c;而实际的方法执行将在单独的线程中进行。 Async 注解有一个可选属性&#xff1a;指定要使用的特定线程…...

【2024年蓝桥杯Java B组】省赛真题详细解析

【2024年蓝桥杯Java B组】省赛真题 距离比赛仅剩5天&#xff0c;大多数省份可能完成3-4题即可拿到省奖&#xff0c;2025年想要拿到省奖&#xff0c;需要高效利用时间&#xff0c;重点突破关键知识点和题型。这里以【2024年蓝桥杯Java B组省赛真题】为例&#xff0c;梳理我们最后…...

SQL:DDL(数据定义语言)和DML(数据操作语言)

目录 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09; DDL和DML的区别 什么是SQL&#xff1f; SQL&#xff08;Structured …...

机器学习核心概念、算法分类与应用场景全解析

文章目录 一、基础任务与算法分类1. 分类任务&#xff08;监督学习&#xff09;2. 回归任务&#xff08;监督学习&#xff09;3. 聚类任务&#xff08;无监督学习&#xff09; 二、关键流程与技术细节1. 数据预处理2. 特征工程3. 数据集划分与评估 三、进阶技术1.深度学习2.强化…...

【leetcode】—416.分割等和子集

✏️ 关于专栏&#xff1a;专栏用于记录 LeetCode 中做题与总结 文章目录 分割等和子集▐ 题目描述▐ 题目示例▐ 题目提示▐ 思路&代码方法&#xff1a;动态规划 分割等和子集 ▐ 题目描述 题目链接&#xff1a;分割等和子集 给你一个 只包含正整数 的 非空 数组 nums …...

jemeter 之mysql驱动问题

问题 java.sql.SQLException: No suitable driver found for jdbc:mysql 解决 先把jar放到lib下 检查 JMeter 的 Classpath 在 JMeter 中&#xff0c;JDBC 驱动需要手动添加到 Classpath 中。 打开 JMeter 安装目录下的 bin/jmeter.properties 文件&#xff0c;找到 user.cla…...