二维数组以及C99中的变长数组(如何在VS2022中使用苹果的clang编译器)
一、二维数组的创建
1.1 二维数组的概念
在上一篇文章中所写的称为一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。
为了更好地理解二维数组,我这里举一个生活中的例子,一个班有5个人,你要储存3个班的成绩,看下图第三个表:
第一行第一个班5人,依次下推,一维数组可以存一个班级的数据,二维数组就可以存多个班级的数据了。
1.2 二维数组的创建
那么我们如何定义二维数组呢?语法如下:
1 type arr_name[常量值1][常量值2];
2
3 例如
4 int arr[3][5];
5 double data[2][8];
上述代码出现的信息:
- 3表示数组有3行
- 5表示每一行有5个元素
- int 表示数组的每个元素是整型类型
- arr 是数组名,可以根据自己的需要指定名字
data数组意思基本一致。
二、二维数组的初始化
在创建变量或者数组的时候,给定一些初始值,被称为初始化。
那么二维数组如何初始化的呢?
二维数组的初始化也像一维数组一样,是使用大括号初始化的。
2.1 不完全初始化
1 int arr1[3][5]={1,2};
2 int arr2[3][5]={0};
这里3行5列15个元素,结果我只放1,2。这没放满呀,就是不完全初始化。
这里的arr1的意思就是1,2,放到第一行前两个元素,后面的元素全部置0,arr2相同的原理,这里附监视内容:
2.2 完全初始化
这里我们再看完全初始化
2.3 按行初始化
1 int arr4[3][5] = { {1,2},{3,4},{5,6} };
在这里的arr4这串代码中,正常来说,它的初始化方式应该是1,2,3,4,5放到第一行,6放到第二行第一个位置。
有的兄弟就说了,主播主播,我有强迫症,想让他雨露均沾平均分配可以吗,当然是可以的,当我们在{ }中,再使用{ }将想要均分的数据括起来后,就可以实现了:
2.4 初始化时省略行,但是不能省略列
之前不是说了一维数组只要初始化了就可以省略掉[ ]内数字的大小,数组的大小会根据初始化的内容来判断,那么二维数组可以吗?
二维数组也是可以的,只不过略有不同,那就是二维数组初始化时只能省略行,但是不能省略列。
接下来讲完二维数组在内存中的存储方式,这里会再加以解释。
三、二维数组的使用
3.1 二维数组的下标
二维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素。
C语言规定,二维数组的行是从0开始的,列也是从0开始的,这里我们用i代表行,用j代表列
图中最左侧绿色的数字表示行号,第一行蓝色的数字表示列号,都是从0开始的,比如,如果想要7,就说第二行第四列。
3.2 二维数组的输入和输出
访问二维数组的单个元素已经知道了,那如何访问整个二维数组呢?
其实我们只要能够按照一定的规律产生所有的行和列的数字就可以了,以下面这串代码为例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{int arr[3][5] = { 0 };//给数组输入值int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){scanf("%d", &arr[i][j]);}}//把数组的内容打印出来for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
这里\n的意思是每一行打印出来换行,这里也可以换行输入,原因涉及到scanf,可以看我之前数据变量那一块的文章。
这是换行输入的结果,是不是和不换行打印出来的效果是一样的呢?
那我们能不能按列打印呢?
当然是可以的,话不多说,展示代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{int arr[3][5] = { 0 };//给数组输入值int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){scanf("%d", &arr[i][j]);}}//把数组的内容打印出来 - 按照列打印for (i = 0; i < 5; i++){int j = 0;for (j = 0; j < 3; j++){printf("%d ", arr[j][i]);}printf("\n");}return 0;
}
上面的代码展示的效果便是按行输入按列打印,简单的把第二个for循环里的条件互换一下就可以了。
当然也可以按列输入按列打印,这里就不作展示了。
四、二维数组在内存中的存储
像一维数组一样,我们如果想研究二维数组在内存中的存储方式,我们也可以打印出数组所有元素的地址,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{int arr[3][5] = { 0 };//给数组输入值int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}
这里稍作解释:
地址打印用%p,这里&是地址打印的时候进行取地址。
printf这行代码的意思是i行j列的下标i,j的地址。
我们进行运行,依旧使用x86的环境,因为打印出来的地址内容更简洁,不懂可以看一维数组那一块:
从输出结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0]之间也差4个字节,足以说明二维数组中每个元素都是连续从放的。
这里为什么说相差四个字节呢?请看图:
这是抄我上个文章的内容的哈哈,实在懒了,十六进制逢16进1,自己算一下就懂了,这里再附加两张计算图吧:
第一个表是我们以为的二维数组在内存中的存放形式,第二个表则是真正的存放形式,即连续存放,就算不同行之间也是连续的。
这里我们就具体说一下二维数组能省略行,不能省略列的具体原因
int arr6[][5] = { 1,2,3,4,5,6,7 };
这里的这个[5]是非常重要的,因为你知道一行是5个元素,所以1,2,3,4,5就必然是第一行,这样6,7就必然在第二行,因为他们是连续存放的,这也是我放到这里解释的原因,只有知道一行有几个元素的时候,这个6才知道从哪开始放。
根据前面对二维数组的讲解,我们是不是可以这样理解:
图中每一个红放开括起来的内容都可以看成一个一维数组,所以这里就可以这么说,二维数组其实是一维数组的数组(二维数组的每个元素可以看成个一维数组)
假设这是一个一维数组的话,这个数组的数组名叫什么?
这里可以称为arr[0],我们在访问它的第一行的每个元素的时候,我们都是arr[0][j],j为一个数字,j的取值范围0-4。每个元素通过[j]定位,那我们就可以认为arr[0]就是这一行的数组名,因为数组名加小标得以访问这个数组的每个元素嘛,后面的也依次类推,整个二维数组的数组名是arr,这里讲了每一行的数组名。
五、C99中的变长数组
在之前数组的创建中我们可以得知,无论是一维数组还是二维数组,数组在创建的时候[ ]中都要用常量值,那么能不能用变量值呢?
可以看到是不可以的,系统会产生报错。
其实在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小。
这样的语法限制,就让创建数组不够灵活了,有时候数组大浪费空间,有时候数组笑了又不够用。
C99中给一个变长数组的新特性,允许我们可以使用变量指定数组大小,但是呢,通过上面的代码,大家发现VS上是不能这样玩的呀,其实真正的原因是VS2022默认使用的msvc这个编译器,msvc不支持C99中变长数组,gcc是支持的,苹果的clang也是支持的,而VS2022中可以使用clang,这里教大家如何使用:
首先在电脑上搜索这样一个程序
等内容加载出来后点击修改
把这里勾选上,然后点击修改
等程序安装好
安装完成后,正常的创建项目,想要让项目里的代码支持C99的变量数组,我们点中项目名称,右击鼠标,点击属性。
然后配置属性-常规-平台工具集,点击平台工具集右边的Visual Studio 2022改为LLVM(clang-cl),之后点击应用,确定就可以了这时候再编译变量数组就不会出现问题了
接下来我们用代码实践:
这样是不是就可以使用变量数组了呢
上面示例中,数组arr就是变长数组,因为它的长度取决于变量n的值,编译器没法事先确定,只有运行时才知道n是多少。
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。有一个比较迷惑的点,变长数组的意思是数组的大小是可以使用变量来指定的,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了。
当然变长数组当然也不是完美的,毕竟不能想改就改,一旦输入确定的数组长度就不能再做更改了,后面我会写关于动态内存管理的问题,动态内存管理就可以做到内存大小的调整。
好了今天的技术分享就到这里了,本来是下周一要考试的,但是因为运动会放了3天假,左右权衡了一下还是觉得可以写的哈哈,明后天主播就要好好复习了,喜欢作者的文章不要忘记一键三连呀!
相关文章:
二维数组以及C99中的变长数组(如何在VS2022中使用苹果的clang编译器)
一、二维数组的创建 1.1 二维数组的概念 在上一篇文章中所写的称为一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以…...
影楼精修-肤色统一算法解析
注意:本文样例图片为了避免侵权,均使用AIGC生成; 本文介绍影楼精修中肤色统一算法的实现方案,并以像素蛋糕为例,进行分析说明。 肤色统一就是将人像照片中皮肤区域的颜色进行统一,看起来颜色均匀一致&…...
mac的Cli为什么输入python3才有用python --version显示无效,pyenv入门笔记,如何查看mac自带的标准库模块
根据你的终端输出,可以得出以下结论: 1. 你的 Mac 当前只有一个 Python 版本 系统默认的 Python 3 位于 /usr/bin/python3(这是 macOS 自带的 Python)通过 which python3 确认当前使用的就是系统自带的 Pythonbrew list python …...
城市内涝监测预警系统守护城市安全
一、系统背景 城市内涝是指由于强降水或连续性降水超过城市排水能力,导致城市内产生积水灾害的现象。随着气候变化和城市化进程的加快,城市内涝现象愈发频繁和严重。传统的城市排水系统已难以满足当前的城市排水需求,特别是在暴雨等极端天气条…...
ThinkPad X250电池换电池芯(理论技术储备)
参考:笔记本电池换电芯的经验与心得分享 - 经典ThinkPad专区 - 专门网 换电池芯,需要克服以下问题: 1 拆电池。由于是超声波焊接,拆解比较费力,如果暴力撬,有可能导致电池壳变形... 2 替换电池芯的时候如…...
2025第三届盘古初赛(计算机部分)
前言 比赛的时候时间不对,打一会干一会,导致比赛时候思路都跟不上,赛后简单复现一下,希望大家批批一下 计算机取证 1、分析贾韦码计算机检材,计算机系统Build版本为?【标准格式:19000】 183…...
qtc++ qdebug日志生成
本文介绍了将qdebug注册到日志系统,这样qdebug打印的信息将记录在日志文本文件,方便观看程序运行中的历史信息,但是需要注意的是,注册后qdebug的信息将不会打印在qtcreator的输出中,所以作者建议,在开发的时…...
Tomcat 配置 HTTPS 访问全攻略(CentOS 环境)
Tomcat 配置 HTTPS 访问全攻略(CentOS 环境) 一、环境说明 操作系统:CentOS Tomcat 版本:Apache Tomcat/9.0.105 服务器 IP:192.168.1.35 目标:将 Tomcat 默认的 HTTP 访问升级为 HTTPS,提…...
20250516使用TF卡将NanoPi NEO core开发板出厂的Ubuntu core22.04.3系统降级到Ubuntu core16.04.2
20250516使用TF卡将NanoPi NEO core开发板出厂的Ubuntu core22.04.3系统降级到Ubuntu core16.04.2 2025/5/16 10:58 缘起:NanoPi NEO core核心板出厂预制的OS操作系统为Ubuntu core22.04.3系统。 【虽然是友善之臂提供的最新的系统,但是缺少很多用用程序…...
针对大事务问题对业务存储过程改造
针对大事务问题对业务存储过程改造 一、问题描述 1. 问题现象 业务调用存储过程没有成功,发现存在大事务,单独拿出来执行发现问题。 greatsql> INSERT INTOywdb1.t1(TIMEKEY,zbbh,zcbl,zcblms,zjzh,zjzhms,cbzh,ljzjzh,xmbh,xmmc,sfgj,dd,ddsm,cb…...
如何解决Move to iOS 不起作用的问题?
iPhone 16系列已经上市有一段时间了。你已经把旧的 Android 手机换成了 iPhone 16 了吗?然而,当您兴奋地准备传输数据时,您发现 Move to iOS 无法正常工作。这确实令人沮丧。但不用担心,因为我们找到了 9 个有效的解决方案&#x…...
npm cross-env工具包介绍(跨平台环境变量设置工具)
文章目录 cross-env:跨平台环境变量设置工具什么是cross-env?为什么需要cross-env?平台差异带来的问题 cross-env的工作原理核心功能技术实现 安装与基本使用安装步骤基本使用方法运行效果 高级使用技巧设置多个环境变量环境变量传递与链式命…...
分布式锁: Redis和ZooKeeper两种分布式锁对比
在分布式系统中,分布式锁是协调多节点共享资源访问的核心机制。Redis 和 ZooKeeper 是两种常用的分布式锁实现方案,但两者的设计理念、适用场景和优缺点存在显著差异。本文将从 一致性模型、性能、可靠性、实现原理 等维度进行对比,并提供技术…...
笔试强训:Day5
一、笨小猴(哈希数学) 笨小猴_牛客题霸_牛客网 #include <iostream> #include <cmath> using namespace std; string s; bool isprime(int x){//试除法if(x2) return true;if(x<2||x%20) return false;int nsqrt(x);for(int i3;i<n;i…...
Flask框架搭建
1、安装Flask 打开终端运行以下命令: pip install Flask 2、创建项目目录 在Windows上: venv\Scripts\activate 执行 3、创建 app.py 文件 可以在windows终端上创建app.py文件 (1)终端中创建 使用echo命令 echo "fr…...
【Kubernetes】单Master集群部署(第二篇)
目录 前言 一、实验环境 二、操作系统初始化配置 三、部署 docker引擎 四、部署 etcd 集群 4.1 准备签发证书环境 4.2 准备cfssl证书生成工具 4.3 生成Etcd证书 4.4 启动etcd服务 4.5 检查群集状态 五、部署 Master 组件 5.1 准备软件包 5.2 创建用于生成CA证书、…...
JavaScript性能优化实战(10):前端框架性能优化深度解析
引言 React、Vue、Angular等框架虽然提供了强大的抽象和开发效率,但不恰当的使用方式会导致严重的性能问题,针对这些问题,本文将深入探讨前端框架性能优化的核心技术和最佳实践。 React性能优化核心技术 React通过虚拟DOM和高效的渲染机制提供了出色的性能,但当应用规模…...
vue3中预览Excel文件
1.前言 有时候项目中需要预览Excel文件,特别是对于.xls格式的Excel文件许多插件都不支持,经过尝试,最终有三种方案可以实现.xlsx和.xls格式的Excel文件的预览,各有优缺点 2.luckyexcel插件 2.1说明 该插件优点在于能保留源文件…...
VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae
1、前言 大杂烩~每次开发一行代码,各个AI争先恐后抢着提供帮助 备注:四款插件都需要先去官网注册账号,安装好之后有个账号验证。 2、插件详解 2.1、AI分析的答案 GitHub Copilot 定位:老牌 AI 代码补全工具,深度集成…...
【问题排查】easyexcel日志打印Empty row!
问题原因 日志打印I/O 操作开销(如 Log4j 的 FileAppender)会阻塞业务线程,直到日志写入完成,导致接口响应变慢 问题描述 在线上环境,客户反馈导入一个不到1MB的excel文件,耗时将近5分钟。 问题排…...
若依框架SpringBoot从Mysql替换集成人大金仓(KingBase)数据库
一、安装人大金仓数据库 1、下载 前往人大金仓数据库下载自己想要的版本(建议下载Mysql兼容版)人大金仓官网,点击服务与支持,点击安装包下载 点击软件版本,选择数据库 选择合适的版本,点击下载࿰…...
Graph Representation Learning【图最短路径优化/Node2vec/Deepwalk】
文章目录 Q1:网络性质:1.数据读取与邻接表构建:2.基本特征和连通性: 算法思路:1. 广度优先搜索(BFS)标记前驱:2. 回溯生成所有最短路径: 实验结果:复杂度分析: Q2&#x…...
ZYNQ Overlay硬件库使用指南:用Python玩转FPGA加速
在传统的FPGA开发中,硬件设计需要掌握Verilog/VHDL等硬件描述语言,这对软件开发者而言门槛较高。Xilinx的PYNQ框架通过Overlay硬件库彻底改变了这一现状——开发者只需调用Python API即可控制FPGA的硬件模块,实现硬件加速与灵活配置。本文将深入探讨ZYNQ Overlay的核心概念、…...
Git基础使用方法与命令总结
Git 是一个分布式版本控制系统,用于跟踪代码或文件的修改历史。以下是 Git 的基础使用方法和常用命令,适合快速上手: 1. 安装与配置 安装 Git 下载地址:https://git-scm.com/downloads(支持 Windows/macOS/Linux&…...
rust语言,与c,go语言一样也是编译成二进制文件吗?
是的,Rust 和 C、Go 一样,默认情况下会将代码编译成二进制可执行文件(如 ELF、PE、Mach-O 等格式),但它们的编译过程和运行时特性有所不同: 1. Rust(类似 C,直接编译为机器码&#x…...
从银行排队到零钱支付:用“钱包经济学”重构Java缓存认知
"当你的系统还在频繁访问数据库银行时,聪明的开发者早已学会用钱包零钱策略实现毫秒级响应——本文将用理财思维拆解缓存设计精髓,教你如何让代码学会小额快付的架构艺术。" 【缓存】作为程序员必须理解的概念之一,让我们用 「钱…...
Json rpc 2.0比起传统Json在通信中的优势
JSON-RPC 2.0 相较于直接使用传统 JSON 进行通信,在协议规范性、开发效率、通信性能等方面具有显著优势。以下是核心差异点及技术价值分析: 一、结构化通信协议,降低开发成本 传统 JSON 通信需要开发者自定义数据结构和处理逻辑,…...
无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。 CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…...
网络安全-等级保护(等保) 2-5-1 GB/T 25070—2019 附录B (资料性附录)第三级系统安全保护环境设计示例
################################################################################ 文档标记说明: 淡蓝色:时间顺序标记。 橙色:为网络安全标准要点。 引用斜体:为非本文件内容,个人注解说明。 加粗标记:…...
精准掌控张力动态,重构卷对卷工艺设计
一、MapleSim Web Handling Library仿真和虚拟调试解决方案 在柔性材料加工领域,卷对卷(Roll-to-Roll)工艺的效率与质量直接决定了产品竞争力。如何在高动态生产场景中实现张力稳定、减少断裂风险、优化加工速度,是行业长期面临的…...
怎么使用python进行PostgreSQL 数据库连接?
使用Python连接PostgreSQL数据库 在Python中连接PostgreSQL数据库,最常用的库是psycopg2。以下是详细的使用指南: 安装psycopg2 首先需要安装psycopg2库: pip install psycopg2 # 或者使用二进制版本(安装更快) pi…...
SQL Server权限设置的几种方法
SQL Server 的权限设置是数据库安全管理的核心,正确配置权限可以有效防止数据泄露、误操作和恶意篡改。下面详细介绍 SQL Server 权限设置的方法,涵盖从登录名创建到用户授权的完整流程。 一、权限设置的基本概念 SQL Server 的权限体系主要包括以下几…...
Neo4j(一) - Neo4j安装教程(Windows)
文章目录 前言一、JDK与Neo4j版本对应关系二、JDK11安装及配置1. JDK11下载2. 解压3. 配置环境变量3.1 打开系统属性设置3.2 新建系统环境变量3.3 编辑 PATH 环境变量3.4 验证环境变量是否配置成功 三、Neo4j安装(Windows)1. 下载并解压Neo4j安装包1.1 下…...
idea启用lombok
有lombok的项目在用idea打开的时候会提示启用lombok,但是。。。不小心就落下了...
uniapp婚纱预约小程序
uniapp婚纱预约小程序,这套设计bug很多,是一个半成品,一个客户让我修改,很多问题,页面显示不了,评论不能用,注册不能用,缺少表,最后稍微改一下,但是也有小问题…...
基于OpenCV的SIFT特征匹配指纹识别
文章目录 引言一、概述二、关键代码解析1. SIFT特征提取与匹配2. 指纹身份识别3. 姓名映射 三、使用示例四、技术分析五、完整代码六、总结 引言 指纹识别是生物特征识别技术中最常用的方法之一。本文将介绍如何使用Python和OpenCV实现一个简单的指纹识别系统,该系…...
Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发
介绍 CDN(内容分发网络)通过全球分布的边缘节点,让用户从最近的服务器获取资源,减少网络延迟,显著提升JS、CSS等静态文件的加载速度。公共库(如Vue、React、Axios)托管在CDN上,减少…...
C++23:ranges::iota、ranges::shift_left和ranges::shift_right详解
文章目录 引言ranges::iota定义与功能使用场景代码示例 ranges::shift_left定义与功能使用场景代码示例 ranges::shift_right定义与功能使用场景代码示例 总结 引言 C23作为C编程语言的一个重要版本,为开发者带来了许多新的特性和改进。其中,ranges::io…...
Spring 框架中适配器模式的五大典型应用场景
Spring 框架中适配器模式的应用场景 在 Spring 框架中,适配器模式(Adapter Pattern)被广泛应用于将不同组件的接口转化为统一接口,从而实现组件间的无缝协作。以下是几个典型的应用场景: 1. HandlerAdapter - MVC 请…...
【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表
更新日期:2025年5月16日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…...
Android SwitchButton 使用详解:一个实际项目的完美实践
Android SwitchButton 使用详解:一个实际项目的完美实践 引言 在最近开发的 Android 项目中,我遇到了一个需要自定义样式开关控件的需求。经过多方比较,最终选择了功能强大且高度可定制的 SwitchButton 控件。本文将基于实际项目中的使用案…...
【C++ 基础数论】质数判断
质数判断 质数:对于所有大于 1 的自然数而言,如果该数除 1 和自身以外没有其它因数 / 约数,则该数被称为为质数,质数也叫素数。 如何判定一个数是否为质数呢? 一个简单的方法是 试除法 : 对于一个数 n&…...
【数据结构】手撕AVL树(万字详解)
目录 AVL树的概念为啥要有AVL树?概念 AVL树节点的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋 AVL树的查找AVL树的验证end AVL树的概念 为啥要有AVL树? 在上一章节的二叉搜索树中,我们在插入节点的操作中。有可能一直往一边插…...
Chrome代理IP配置教程常见方式附问题解答
在网络隐私保护和跨境业务场景中,为浏览器配置代理IP已成为刚需。无论是访问地域限制内容、保障数据安全,还是管理多账号业务,掌握Chrome代理配置技巧都至关重要。本文详解三种主流代理设置方式,助你快速实现精准流量管控。 方式一…...
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
SpringBoot Shiro JWT 实现认证与授权完整方案 下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统,包含核心代码实现和最佳实践。 一、技术栈组成 技术组件- 作用版本要求SpringBoot基础框架2.7.xApache Shiro认证和授权核心1.…...
深入解析VPN技术原理:安全网络的护航者
在当今信息化迅速发展的时代,虚拟私人网络(VPN)技术成为了我们在互联网时代保护隐私和数据安全的重要工具。VPN通过为用户与网络之间建立一条加密的安全通道,确保了通讯的私密性与完整性。本文将深入解析VPN的技术原理、工作机制以…...
OceanBase 的系统变量、配置项和用户变量有何差异
在继续阅读本文之前,大家不妨先思考一下,数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊,那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…...
ReinboT:通过强化学习增强机器人视觉-语言操控能力
25年5月来自浙大和西湖大学的论文“ReinboT: Amplifying Robot Visual-Language Manipulation with Reinforcement Learning”。 视觉-语言-动作 (VLA) 模型通过模仿学习在一般机器人决策任务中展现出巨大潜力。然而,训练数据的质量参差不齐通常会限制这些模型的性…...
MySQL联表查询:多表关联与嵌套查询指南
引言 各位数据库爱好者们好!今天我们要挑战MySQL查询技能的高阶关卡——复杂查询 🚀。在真实业务场景中,数据往往分散在多个表中,就像拼图的各个碎片,只有掌握了多表查询的"拼图技巧",才能将它们…...
QBasic 一款古老的编程语言在现代学习中的价值(附程序)
QBasic(Quick Beginner’s All-purpose Symbolic Instruction Code)是微软公司于 1991 年推出的一款简单易学的编程语言,作为BASIC语言的变种,它曾广泛应用于教育领域和初学者编程入门。尽管在当今Python、Java等现代编程语言主导…...