C语言学习笔记(2)
在学习前,需要有一定的C语言基础。不必很深入,只需要知道函数,头文件,指针,数组等的概念就可以,但并非0基础笔记。
由于写到后面,不好编辑了,决定分成多篇写,请按编号学习,或者直接看目录先。
说明:该文章来自本人学习时的笔记,使用的编译器是Visual Studio,如有错误,可以在评论区或者私信我纠正,谢谢
13.指针基础
13.1内存模型
计算机最小的寻址单位:Byte字节,现在普遍都是一个字节是一个地址单位,1Byte=1bit
变量的地址:变量常常不止占用一个地址,所以变量的地址是首字节的地址
指针:地址
指针变量:存储地址的变量,往往指针变量也叫指针,一般可以理解是指针还是指针变量,(地址≠存储地址的变量)
13.2指针
int * p:存储int类型地址的指针
int的作用是表示指向对象的类型,也表示对象所占内存的大小,和解释那片内存的空间。
变量的类型是int *
int *p,q; //p的类型是int *,q的类型是int
int *p,*q; //p和q的类型都是int*
当时的条件过于苛刻,存储空间是非常宝贵的。
如今建议一个变量写一行,单独声明,提高可读性。
int *p;int i=1;p=&i;printf("*p=%d p=%d",*p,p);
*p 的 * 是解引用
访问 i 和 *p 的区别:但是实际上这个差距由于缓存的设计可以忽略,不必关注这个
i:直接访问内存空间,逻辑上访问一次
*p:间接访问,先访问p得到i的地址,再通过i的地址访问i,逻辑上访问内存两次
13.3野指针
野指针是表示没有初始化的指针,但是有初始值。如果直接对整数值赋值也是野指针,对嵌入式编程的时候可能会要进行整数赋值。
部分编译器在读取野指针的值的时候,可能会编译不过。对野指针解引用,会引发各种问题
千万不要放任野指针不管!
野指针就是不知道指向那块数据的指针
13.4空指针
不指向任何对象的指针,比如比较常见的,在使用链表的时候就可能需要使用空指针。
13.5指针赋值
指针变量赋值:指的是对指针赋值,把指针指向不同的地址
int i=0;
int *p ;
p = &i //这个是对指针变量的赋值
指针变量指向对象的赋值:对指针变量指向的地址所存的内容赋值,把p指针指向i,通过解引用,修改*p的值,来修改i的值。
int i=0;
int *p;
p=&i;
*p=1;//此时i的值被修改为了1
*p=*q的作用把*p的值,修改为*p的值,指针指向的地址并没有改变,但是指针指向地址所存储的值发生了变化。
13.6指针在函数中的应用
13.6.1指针作为参数
指针作为参数,传递的是地址,在被调函数中修改值,会修改主调函数中变量的值。
void foo (int *a){a=1;//主调函数调用以后,a的值会变成1
}
因为C语言的特点,C语言只能有一个返回值,但是往往传入参数a可以作为返回值使用
在函数中直接使用a改变的是a的地址,对a解引用,直接对*a赋值才是修改a指向内存的值。
void min_max(const int arr[],int n,int *pmin,int *pmax){//arr[]作为传入参数,pmin和pmax可以作为传出参数返回值*pmax=arr[0];*pmin=arr[0];for(int i=1;i<n;i++){if (arr[i]<*pmin){*pmin=arr[i];}else if (arr[i]>*pmax){//比最小值小一定比最大值小,优化程序的性能*pmax=arr[i];}}
}
13.6.1指针作为返回值
指针作为返回值的时候,要注意函数的生命周期
int *foo(void) {int arr[] = {1, 2, 3, 4};return &arr[1];
}
int main(void) {int *p = foo();printf("*p = %d\n", *p);printf("*p = %d\n", *p);return 0;
}
两次并没有做任何操作,但是值却不一样。
如下图,在执行完foo以后,返回的是arr[1]的地址,第一次读取arr[1]的时候,foo还没有出栈,*p的值被foo修改为了2,所以第一次读取到的是正确的值,当第一次读取完以后,在第二次的时候,foo出栈了,也就是内存中不存在foo的栈帧了,*p指向的地址,所存储的栈帧发生了变化,故第二次读取到的值为不是2,由于编译器不一样可能读取到不同的值,一些编译器会把未初始化的值修改为0,一些编译器会直接读取指向内存的“脏数据”。
教训:千万不要返回指向当前栈帧的指针
13.7指针常量与常量指针
指针常量指的是指针指向的一个地址,对这个地址的内存,对这个指针来说解引用以后是一个常量,只有读权限,没有写权限。但是可以指向不同的地址
常量指针指的是指针指向一个地址,对这个指针变量来说,他不能修改指向的地址,但是可以修改这个地址的内存。
int i=10,j=20,k=30;
int* p=&i;
*p=10;//*p对i的内存有写权限
const int* q=&i;//指针常量
//*q=10; [Error] assignment of read-only location '* q'
//*q对i就没有写权限,i的内存可以修改,但不能通过p去修改
int* const c = &j;
*c = 10;//常量指针可以修改内存,但是不能修改其指向的地址
//c=&j; [Error] assignment of read-only variable 'c'
常量指针对地址1有写权限,对地址2没有
指针常量对地址3没有写权限,对地址4有写权限
如果两个地方都加常量,则两个地址都没有写权限,const的本质是控制变量的权限
如const int * p = &i;
13.4指针与数组的关系
数组在作为参数的时候,会退化为指针
详细请看这篇文章12.4部分:C语言学习笔记(1)-CSDN博客
指针不是整数,指针+1的值实际上是指针向右偏移1的单位
用指针可以用来处理数组
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int sum = 0;for (int *p = &arr[0]; p < &arr[20]; p++) {//p不会显示越界,但是当p超过arr的边界的时候,会变成野指针,所以一定要确定p的范围sum += *p;printf("*p = %d ;sum = %d\n", *p,sum);}
在必要的时候,数组可以退化成指向他索引为0元素的指针
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int sum = 0;for (int *p = arr; p < arr+10; p++) {sum += *p;printf("*p = %d ;sum = %d\n", *p,sum);}
指针的运算:
指针不是整数,可以相减,结果是整数,大小为偏移量的大小
但是不能相加、乘、除
指针可以进行比较运算
*可以和++,--相结合使用
区分(--的话类比):
*p++,*(p++):值为*p,副作用为p自增 (这个最常使用)
(*p)++:值为*p,副作用为*p自增
*++p,*(++p):值为*(p+1),副作用为p自增
++*p,++(*p):值为*(p+1),副作用为*p自增
14.字符串
14.1字符串字面值
字面值一定是常量,如“Hello world”,但常量不一定是字面值,如 const int i=1;
字符串的书写:
1.直接一行写完
2.使用跨行符
3.两个字符串直接只有空白字符,编译的时候是相邻的
printf("Hi NNNNNNNNN""NNNNNNNNNNNN");
14.2字符串的内存模式
字符串的字面值是不可以修改的!
“ABC”在内存中的储存是ABC\0
printf("%c","ABC"[0]);
'\0'是空字符,在代码中占一个字符
14.3字符串字面值支持的操作
常量数组能支持的操作,字符串都可以支持
总纲:
1.C语言没有字符串类型
2.C语言中的字符串很依赖字符串数组的存在,遇到空字符结算
3.C语言中的字符串是一种逻辑类型
4.在C语言的字符串求长度时间复杂度是O(n),strlen的性能会很差
14.4字符串的语法结构
1.声明字符串变量并赋初始值
两个初始化方式是一样的,str2是str1的初始化方式是一样的,只是使用“语法糖”简写(对语法糖的表示可能不太准确,但就是这个·意思),只是机器帮你解决了str2转str1的步骤。
char str2[]={ 'h','e','l','l','o','\0' };//字符串数组初始化式,不要漏了'\0'
char str2[]="hello";//语法糖方式写
初始化的选择:
初始化字符数组使用str1的方式,初始化字符串使用str2的方式,提高可读性
2.一些细节
char str1[]="hello";//长度为6
char str2[10]="hello";//前面6个初始化为和str1一样,后面4个初始化为'\0'
char str3[5]="hello";//长度为5,但不是字符串,因为,没有以'\0'结尾
str的“hello”是字符串,在栈里面
p指向的“hello”是字面值,在代码段,是无法修改的
char str[] ="hello";//"hello":数组的初始化char* p = "hello";//"hello":字符串的字面值
14.5字符串的读写
输出p个字符,
printf("%.5s",str);//只输出5个字符
14.5.1scanf读写字符串
%s的匹配规则:
忽略前置空的字符,读取字符填入字符数组,遇到空白字符结束
scanf的缺点:
1.不能存储空字符
2.不会检查数组越界
14.5.2puts与gets
puts等价于printf(“s%\n”,str);//输出字符串的时候会自动换行
gets的原理是读取一行数据存入字符数组,并将换行符替换成空字符,gets也不会检查数组越界
14.5.3fgets(str,n)
和get差不多,但可以读取n个数据,会检查避免数组越界,会存储换行符,并在后面添加空字符。
14.6字符串变量的操作<string.h>
前面先说:掌握两个惯用法就好,在实际使用的时候,直接使用库里面的就好,不要自己去实现!!!
14.6.1 strlen(str)
读取一个字符串的长度,时间复杂度为O(n),不会计算空字符
实现:
方法1:
typedef int size_str;
size_str strlen(char *str){
size_str str_len=0;
while(*str!='\0'){
str_len++;
str++;
}
return str_len;
}
改进:领会字符串的方法
size_str strlen1(char *str) {
const char* p=str;
while(*p){ //遍历字符串惯用法
p++;
}
return p-str;
}
14.6.2 strcpy(str1,str2)
复制字符串,但不会检查越界,返回值为str1
strncpy(str1,str2,n);//strcpy的安全版本,n是表示字符串长度(不包括'\0'),保证不越界
实现strcpy:
char* strcpy(char* str1, char* str2) {
while(*str2){
*str1 = *str2;//复制
str1++;
str2++;
}
*str1 = '\0';//不要忘记了最后补空字符
return str1;
}
改进版本:
char* strcpy(char* str1, char* str2) {
while (*str1 ++ = *str2 ++)
;//复制字符串惯用法,可以复制空字符串
return str1;
}
实现strncpy:
char* strcpy(char* str1, char* str2) {
while (*str1 ++ = *str2 ++)
;
return str1;
}
14.6.3 strcat(str1,str2)
字符串拼接,str1一定要数组,而且str1的长度一定要可以存下拼接后的字符串,否则会越界
strncat(str1,str2,n),可以控制字符串长度,n的值为还可以拼接多少个字符(不包括‘\0’)
strncat实现
char* strcat1(char* str1, char* str2, int count) {
char*p = str1;
while (*str1) {
str1++;
}
while ((count-->0)&&(*str1++ = *str1++))
;
return p;
}
14.6.4 strcmp(str1,str2)
字符串比较,返回结果为str1-str2的值
比较规则:字典序,根据ASCII比较
实现:
int strcmp(const char* str1,const char* str2){
while(*str1&&*str2){
if(*str1 != *str2){
return *str1-*str2;
}
str1++;
str2++;
}
return *str1-*str2;
}
14.7字符串数组
在C语言里面,字符串数组是字符数组的数组,本质上就是字符二维数组,
字符串数组 char c[ ] ={"APPLE","APP","APPL","AP","APPL" }在内存中存储的内容如下
字符指针数组:用指针指向空间,只在末尾有一个‘\0’
相关文章:
C语言学习笔记(2)
在学习前,需要有一定的C语言基础。不必很深入,只需要知道函数,头文件,指针,数组等的概念就可以,但并非0基础笔记。 由于写到后面,不好编辑了,决定分成多篇写,请按编号学…...
macos 隐藏、加密磁盘、文件
磁盘加密 打开磁盘工具 点击添加 设置加密参数 设置密码 查看文件 不用的时候右键卸载即可使用的时候装载磁盘,并输入密码即可 修改密码 解密 加密,输入密码即可 禁止开机自动挂载此加密磁盘 如果不禁止自动挂载磁盘,开机后会弹出输入…...
机器学习(二)-简单线性回归
文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …...
TP5 动态渲染多个Layui表格并批量打印所有表格
记录: TP5 动态渲染多个Layui表格每个表格设置有2行表头,并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例: /*** Nod…...
Random模拟概率问题
问题背景: 使用 random.nextInt(100) < 10 这段代码来模拟 10% 的概率,其中: random.nextInt(100) 会生成一个 0 到 99 之间的整数。 如果结果小于 10,则表示触发事件,概率为 10/100 10%。 核心问题:…...
适用于Synology NAS的在线办公套件:ONLYOFFICE安装指南
使用 Synology NAS 上的 ONLYOFFICE 文档,您能在私有云中直接编辑文本文档、电子表格、演示文稿和 PDF,确保工作流程既安全又高效。本指南将分步介绍如何在 Synology 上安装 ONLYOFFICE 文档。 关于 Synology Synology NAS(网络附加存储&…...
Go的defer原理
Go 语言中的 defer 语句用于延迟执行一个函数,直到包含该 defer 语句的函数执行完毕时才执行。defer 主要用于资源清理、文件关闭、解锁互斥锁等操作,以确保这些操作在函数返回前被执行,无论函数是正常返回还是由于错误提前返回。 以下是 de…...
达梦数据库迁移到MySQL字段注释缺失问题处理
目录 1、环境信息 2、问题详情 3、处理方案 3.1、提取备用库字段注释 3.2、生成正式库字段注释 1、环境信息 达梦数据库版本:v8 MySQL数据库版本:5.7.11 正式库:通过DTS迁移后的MySQL数据库 备用库:表结构与正式库一致&#…...
IntelliJ Idea常用快捷键详解
文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中ÿ…...
Java操作Xml
一、数据准备 1、文件头实体类 package com.xiaobai.xmlpractice;import lombok.AllArgsConstructor; import lombok.Data;/*** Author 王天文* Date 2024/12/18 21:46* Description: xml头*/ AllArgsConstructor Data public class Head {private String desc;private Strin…...
CI/CD是什么?
CI/CD 定义 CI/CD 代表持续集成和持续部署(或持续交付)。它是一套实践和工具,旨在通过自动化构建、测试和部署来改进软件开发流程,使您能够更快、更可靠地交付代码更改。 持续集成 (CI):在共享存储库中自动构建、测试…...
某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题
一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题 延迟问题 navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) > {console.log(stream) })从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前…...
基础优化方法
梯度下降 学习率代表每一次沿着这个方向走多远, batchsize的概念 梯度下降通过不断沿着反梯度方向更新参数求解 两个重要的超参数是 batchsize 和 学习率...
linux系统上SQLPLUS的重“大”发现
SQL plus版本: [oraclepg-xc2 ~]$ sqlplus -v SQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 操作系统:CentOS Linux 7 (Core) 数据库:Oracle 19c Version 19.3.0.0.0 同样的SQL脚本在windos CMD sqlplus 执行没问题。…...
【0x001F】HCI_Read_Clock_Offset命令详解
目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Read_Clock_Offset 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Clock_Offset_Complete 事件 四、命令执行流程 4.1. 命令发送阶段 4.2. 命令接收与初步反馈阶段 …...
UML(统一建模语言)及其图例使用指南
UML(统一建模语言)及其图例使用指南 一、UML 介绍二、UML 图表1. 用例图(Use Case Diagram)2. 类图(Class Diagram)3. 对象图(Object Diagram)4. 序列图(Sequence Diagra…...
AI写标书工具:高效智能的标书撰写助手——标小兔
在现代商业竞争中,投标是许多企业获得项目的关键途径。而标书的质量直接影响中标的几率。传统的标书撰写过程繁琐,且容易出错,尤其是涉及到大量的数据整理、文字表达和排版工作,这些任务既费时又容易让人产生疲劳感。为了提升工作…...
计算机考研选西电还是成电?
谢邀~先来个总结:电子科技大学计算机综合实力优于西安电子科技大学,但是,二者计算机学硕考研难度没有太大差距,而且考试难度也同属于一个水平,成电性价比更高一些!推荐同学优先报考作为985的电子科技大学&a…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)(一)
在C编程中,顺序结构和分支结构是两种基本的控制流结构,其中顺序结构是一种最简单、最基本的控制结构,即代码按照从上到下的顺序逐行执行,每个语句按照顺序执行,一条语句执行完再执行下一条语句,依次执行所有…...
【再谈设计模式】享元模式~对象共享的优化妙手
一、引言 在软件开发过程中,我们常常面临着创建大量细粒度对象的情况,这可能会导致内存占用过高、性能下降等问题。享元模式(Flyweight Pattern)就像是一位空间管理大师,它能够在不影响功能的前提下,有效地…...
NestJS中使用nestjs-plugin-module实现插件系统
1. 安装依赖 npm install brewww/nestjs-plugin-module2. 定义插件接口 首先,我们需要定义一个插件接口,这个接口定义了插件需要实现的方法。 hello/plugin.interface.ts export interface HelloServicePlugin {helloworld(): string;hello(name: st…...
jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针
概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…...
Presence:Colyseus用于管理实时分布式数据的工具
Colyseus Presence 详细介绍 Presence 是 Colyseus 中用于管理实时分布式数据的一种工具。它主要用于在多房间、多服务器或分布式部署中实现玩家的实时在线状态、数据共享和通信。Presence 提供了一套简单的 API 来处理诸如在线玩家跟踪、分布式数据存储和发布/订阅模式等功能…...
梳理你的思路(从OOP到架构设计)_认识框架(Framework) 01
目录 1、 是框架的核心要素编辑&i> 范例1: 范例2: 范例3: 1、 <E&I>是框架的核心要素 在特定领域(Domain)里,将EIT造形的<E&I>部份有意义地组合起来,就成为框架(Framework)了。基本…...
【C++11】类型分类、引用折叠、完美转发
目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后,进一步对类型进行了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值 (expiring value,简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…...
字节跳动Java开发面试题及参考答案(数据结构算法-手撕面试题)
怎么判断两个链表是否相交?怎么优化? 判断两个链表是否相交可以采用多种方法。 一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指…...
科汛网校KesionEDU CheckOrder SQL注入漏洞复现
0x01 产品简介 科汛网校KesionEDU是KESION科汛开发的在线教育建站系统,支持在线直播教学、课程点播、录播授课等多种教学方式,满足不同场景下的教学需求。提供问答互动、学习点评、在线笔记等功能,增强学员与教师之间的互动交流。拥有在线考试系统,支持单选、多选、问答等…...
【ELK】ES单节点升级为集群模式--太细了!
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件,增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…...
Spring AOP是什么
目录 谈谈自己对于 AOP 的了解 Spring AOP 和 AspectJ AOP 有什么区别? AOP 常见的通知类型有哪些? 多个切面的执行顺序如何控制? 谈谈自己对于 AOP 的了解 AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑…...
Ch9 形态学图像处理
Ch9 形态学图像处理 blog点此处!<--------- 四大算子相应性质。 腐蚀、膨胀、开闭之间的含义、关系 文章目录 Ch9 形态学图像处理预备知识(Preliminaries)膨胀和腐蚀(Dilation and Erosion)腐蚀膨胀膨胀与腐蚀的对偶关系 开闭操作(Opening and Closing)开运算闭…...
epoll学习
epoll是1个服务端监听n个客户端的多路复用技术(通讯方式socket) epoll:(事件驱动)服务端通过管道通讯方式将有变化事件的客户端保存到1个队列 select/poll:(轮询驱动)服务端主动遍…...
《CS2》报错dxgi.dll缺失怎么办?《CS2》游戏提示dxgi.dll缺失要怎么解决?
一、dxgi.dll缺失的根源 游戏安装问题:dxgi.dll文件是DirectX图形接口的一部分,如果游戏安装不完整或安装过程中出现问题,可能会导致该文件缺失。 系统更新或配置变动:Windows操作系统的更新或某些系统配置的变动,有时…...
Python基础语法之元组
主页有列表,集合和字典的知识点(包含对应练习^V^) 关注我更新更多初学实例(下一个更新元组基础练习,然后集中更新一下C语言) 欢迎纠错 元组 一.元组的应用场景 思考:如果想要存储多个数据&am…...
如何实现 MySQL 的读写分离?
面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 高并发这个阶段,肯定是需要做读写分离的,啥意思&#x…...
Vue.js框架:在线教育系统的安全性与稳定性
2.1系统开发使用的关键技术 本系统在开发中选择B/S框架进行设计,语言采用Java,数据库采用Mysql,并在设计中加入VUE.js技术,本系统的运行环境为Idea。 2.2 VUE.js技术介绍 VUE.js是一个用来开发前台界面的JavaScript框架࿰…...
[python SQLAlchemy数据库操作入门]-11.面向对象方式操作股票数据
哈喽,大家好,我是木头左! 通过ORM,开发者可以使用Python类来表示数据库表,从而使得数据库操作更加直观和易于维护。本文将介绍如何使用SQLAlchemy ORM来操作股票数据。 安装 SQLAlchemy 需要安装SQLAlchemy库。可以使用pip命令进行安装: pip install sqlalchemy定义股票…...
Windows 11 中利用 WSL - Linux 虚拟环境部署 ChatTTS-Enhanced 项目教程
#工作记录 在使用 Windows 系统尝试部署一些特定项目时,我们可能会遇到各种各样依赖包安装的问题。比如在 Windows 系统下,当我们想要在 Python 3.10 虚拟环境中,使用命令 “pip install resemble-enhance” 以及 “pip install WeTextProces…...
NPM老是无法install,timeout?npm install失败
NPM老是无法install,timeout? 尝试一下如下操作 一、 更换国内源 npm config set registry https://registry.npmmirror.com npm install或指定源install npm install pkg --registry https://registry.npmmirror.com --legacy-peer-deps如下图 二…...
音乐极客的新玩具:香橙派Zero3快速搭建Melody个人音乐平台
文章目录 前言1. 添加镜像源2. 本地部署Melody3. 本地访问与使用演示4. 安装内网穿透5. 配置Melody公网地址6. 配置固定公网地址 前言 今天要给喜欢听音乐的朋友们介绍一个超酷的DIY项目,在香橙派Zero3上使用Melody搭建自己的个人在线音乐平台,并且借助…...
springboot3版本结合knife4j生成接口文档
1.概述 knife4j官网为:介绍 | Knife4j (xiaominfo.com)https://doc.xiaominfo.com/docs/introduction 初步了解的码友可以初步了解一下官网的如下几个模块: 其中在快速开始模块中,不同的springboot版本都有一个使用的案例demo如下图位置&am…...
广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!
一、适用范围 适合广州大彩A40系列产品 产品型号: 二、概述 CVBS只需要一条线缆即可完成视频信号的传输,具有兼容性强、使用简单、成本低廉等优点。典型分辨率为720x480(NTSC制)或720x576(PAL制)。 三、…...
pikachu靶场搭建详细步骤
一、靶场下载 点我去下载 二、靶场安装 需要的环境: mysqlApaches(直接使用小皮面板Phpstudy:https://www.xp.cn/),启动他们 设置网站,把靶场的路径对应过来 对应数据库的信息 由于没有核对数据库的信…...
Astherus 联手 PancakeSwap 推出 asCAKE,CAKE 最大化收益的最优解?
Astherus 是本轮市场周期中最具创新性的 DeFi 协议之一,其通过推出 AstherusEx 以及 AstherusEarn 两个产品,正在基于真实收益启动 DeFi 市场的增长,并成为加密投资者捕获收益的最佳协议。PancakeSwap 是 BNB Chain 上最大的 DEX,…...
JVM实战—2.JVM内存设置与对象分配流转
大纲 1.JVM内存划分的原理细节 2.对象在JVM内存中如何分配如何流转 3.部署线上系统时如何设置JVM内存大小 4.如何设置JVM堆内存大小 5.如何设置JVM栈内存与永久代大小 6.问题汇总 1.JVM内存划分的原理细节 (1)背景引入 (2)大部分对象的存活周期都是极短的 (3)少数对象…...
无问社区-无问AI模型
无问AI模型是无问社区新上线的一款AI功能,支持文本图像的输入,在文本理解能力、推理能力、视觉能力上相较于“社区助手”有了很大的提升。 我们在预训练模型的技术上增加1.7亿token的训练数据进行强化训练使其具备更好的效果。 更好的消息是我们准备了…...
【记录】列表自动滚动轮播功能实现
目录 效果展示代码 效果展示 代码 <!-- 首页 --> <template><div class"page_body_item_body" mouseenter"stopScroll" mouseleave"scroll(false)"><ele-tableclass"eleTable":table-options"options"…...
前缀树介绍
数风流人物,还看今朝! 前缀树 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。 前…...
Solon v3.0.5 发布!(Spring 可以退休了吗?)
Solon 框架! 新一代,面向全场景的 Java 应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单提倡: 克制、高效、开放、生态 有什么特点&am…...
基础组件:
基础组件: RichText 富文本组件,解析并显示HTML格式文本。 适用场景: RichText组件适用于加载与显示一段HTML字符串,且不需要对显示效果进行较多自定义的应用场景。RichText组件仅支持有限的通用属性和事件。具体见属性与事件…...
【LeetCode 面试经典150题】详细题解之滑动窗口篇
【LeetCode 面试经典150题】详细题解之滑动窗口篇 1 滑动窗口理论基础1.1 算法思想1.2 使用场景1.3 使用思路 2 209.长度最小的子数组2.1 题目分析2.2 算法步骤2.3 代码实现2.4 时间复杂度 3 3.无重复字符的最长字串3.1 题目分析3.2 算法步骤3.3 代码实现3.4 复杂度分析 4 30.串…...