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

【C语言航路】第六站:指针初阶

目录

一、指针是什么

二、指针和指针类型

1.指针类型的意义

2.指针+-整数

3.指针解引用

三、野指针

1.野指针的成因

(1)指针未初始化

(2)指针越界访问

(3)指针指向的空间释放

 2.如何规避野指针

(1) 指针初始化

(2) 小心指针越界

(3) 指针指向空间释放,及时置NULL

(4) 避免返回局部变量的地址

(5) 指针使用之前检查有效性

四、指针运算

1.指针+-整数

2.指针-指针

3.指针的关系运算

五、 指针和数组

六、二级指针

1.什么是二级指针?

2.二级指针的解引用

 七、指针数组

1.指针数组的概念

 2.尝试模拟一个二维数组

 总结


一、指针是什么

这部分内容,在我们之前的文章中已经提及过

链接:【C语言航路】第一站:(初识C语言(终幕)

这里在简单的回忆一下

学习指针必须先要理解——内存,内存是电脑上的存储设备,一般都是4G/8G/16G等,程序运行的时候会加载到内存中,也会使用内存空间

我们将内存划分为一个个小格子,每一个格子是一个内存单元,也正好是一个字节的大小,对每一个内存单元进行编号,在生活中我们也将这一个个编号称作地址,而地址在c语言中又叫做指针

 我们举一个例子,假设我们定义一个变量 int a=10;那么a是一个int类型的变量,需要占用四个字节的空间,而每个字节都有地址,&a取出的是哪一个的地址呢?其实取出的是第一个字节的地址(较小的地址),也就是说,下图中,&a最终取出来的地址是0x0012ff40 ,而这个地址我们可以存放到一个变量中,int* pa=&a,这颗*代表pa是一个指针,int代表pa所指向的类型是int类型,这个pa也叫做指针变量。

理解指针需要理解两个要点

1.指针是内存中一个最小单元的编号,也就是地址

2.平时口头语中所说的指针,通常指的是变量,是用来存放内存地址的变量

总结:指针就是地址,平时口头语中的指针通常指的是指针变量

我们看这段代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 10;int* p = &a;printf("%p\n", &a);printf("%p\n", p);return 0;
}

运行结果为,打印出来的地址是一样的

 我们还可以看这段代码,使用*来解引用指针

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 10;int* p = &a;printf("%p\n", &a);printf("%p\n", p);*p = 20;printf("%d", a);return 0;
}

运行结果为

总结:指针变量,就是用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

那这里的问题是: 一个小的单元到底是多大?   其实是1个字节

那么如何编址呢?

经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。 对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电 平(低电压)就是(1或者0)

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

.....

11111111 11111111 11111111 11111111

这里就有2的32次方个地址。 每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB)

4G的空间进行编址。 同样的方法,那64位机器,如果给64根地址线,那能编址多大空间,我们也可以计算出来

这里我们就知道了:

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以 一个指针变量的大小就应该是4个字节。

那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地 址。

总结: 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。 指针的大小在32位平台是4个字节,在64位平台是8个字节

二、指针和指针类型

1.指针类型的意义

我们在上面了解了

32位机器上,地址是4个字节,指针变量的大小也是4个字节

64位机器上,地址是8个字节,指针变量的大小也是8个字节

那在这里就有人产生困惑了,反正都是4个或者8个字节,那为什么要区分int*,char*.....这些呢?为什么不直接弄一个通用指针呢?

其实既然计算机没有这个通用指针,那就说明这些类型是有意义的。我们现在就来探讨以下这些指针的类型的意义。

为了了解这个内容,我们先看这个代码

#include<stdio.h>
int main()
{int a = 0x11223344;int* pa = &a;*pa=0;return 0;
}

我们打开调试,窗口,内存,并将列改为4

 继续往下走

 我们发现,四个字节全部被改为0

我们在看这一段代码

#include<stdio.h>
int main()
{int a = 0x11223344;//int* pa = &a;char* pc = &a;*pc = 0;return 0;
}

我们仍然监视内存

 继续往下走

 我们发现只改变了一个字节。

所以我们得出结论:指针类型是有意义的

指针类型决定指针进行解引用时候,一次访问几个字节(访问权限)

int*访问四个字节 char*访问一个字节,float*访问四个字节

我们在继续看这个代码

#include<stdio.h>
int main()
{int a = 0x11223344;int* pa = &a;char* pc = &a;printf("%p\n", pa);printf("%p\n", pa+1);printf("%p\n", pc);printf("%p\n", pc+1);return 0;
}

运行结果为

 由此我们发现,pa+1跳过了四个字节,pc+1跳过了一个字节

所以我们得出

指针类型决定指针的步长(指针+1到底跳过几个字节)

字符指针+1,跳过一个字节

整型指针+1,跳过四个字节

我们可以看这个代码

#include<stdio.h>
int main()
{int a = 0x11223344;char* pc = (char*)&a;int i = 0;for (i = 0; i < 4; i++){*pc = 0;pc++;}return 0;
}
我们先取出a的地址放到一个char*类型的指针中,因为a取地址后是一个int*类型的指针,所以要强制类型转换。对其进行遍历四次,每次只能改一个字节的空间,四次刚好将a改为0。

我们在这里在总结一下指针类型的意义:

1.

指针类型决定指针进行解引用时候,一次访问几个字节(访问权限)

int*访问四个字节 char*访问一个字节,float*访问四个字节

2.

指针类型决定指针的步长(指针+1到底跳过几个字节)

字符指针+1,跳过一个字节

整型指针+1,跳过四个字节

2.指针+-整数

我们在上面说过,指针的不同类型,其实提供了不同的视角去观看和访问内存

char*一次访问1个字节,+1跳过一个字节

int *一次访问4个字节,+1跳过四个字节

当然在这里,除了+1,还可以-5,+2等操作

比如int*  pa=10;

pa+4  其实就是向后走4*sizeof(int)个字节,也就是+16个字节

pa-5   其实就是向前走5*sizeof(int)个字节,也就是-20个字节

也就是指针类型决定了指针向前或向后走一步有多大(距离)

3.指针解引用

这里也同样在前面说过了

指针的类型决定了对指针解引用时有多大权限(能操作几个字节)

比如char*指针解引用一次就能操作一个字节,而int*指针解引用一次可以操作4个字节

三、野指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

1.野指针的成因

(1)指针未初始化

#include <stdio.h>
int main()
{int* p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}

如上代码所示,指针是一个局部变量未初始化,默认未随机值,这样随意进行修改指针的值是非常危险的行为。

(2)指针越界访问

#include <stdio.h>
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;for (i = 0; i <= 11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

如上代码所示,指针的指向范围超出了数组arr的范围,p就是一个野指针,此时如果随意修改指针里的内容是很危险的,假如这个野指针指向的恰好就是本程序已有的其他值,那么就会出现问题。

(3)指针指向的空间释放

我们看这个代码

#include<stdio.h>
int* test()
{int a = 10;return &a;
}
int main()
{int* p = test();printf("%d", *p);return 0;
}

这个代码也是,a是一个局部变量,返回的时候a已经被销毁了,此时的这个地址就是一个野指针。

当然我们可以运行一下,我们会发现仍然是10,这是因为之前的函数栈帧还没有被破坏掉。我们加上个代码就能破坏掉这个函数栈帧,导致结果不一样

 2.如何规避野指针

(1) 指针初始化

#include<stdio.h>
int main()
{int a = 0;int* pa = &a;//指针的初始化int* pc = NULL;//空指针,专门用来初始化指针return 0;
}

如上代码所示,如果不知道该初始化成什么,可以初始化成NULL,当然要注意,空指针不可以解引用。解引用空指针会使程序崩溃。因为0地址处是不能让用户使用的

(2) 小心指针越界

(3) 指针指向空间释放,及时置NULL

(4) 避免返回局部变量的地址

(5) 指针使用之前检查有效性

四、指针运算

指针的运算共有三种

1.指针+- 整数

2.指针-指针

3.指针的关系运算

1.指针+-整数

这快的内容在前文中已经涉及过,这里在简单的讲解一个案例

#define N_VALUES 5
#include<stdio.h>
int main()
{float values[N_VALUES];float* vp;//指针+-整数;指针的关系运算for (vp = &values[0]; vp < &values[N_VALUES];){*vp++ = 0;}return 0;
}

这段代码唯一需要注意的就是一个表达式*vp++。++的优先级比较高,但是由于他是前置++,所以先解引用vp,然后vp++。最终的效果就是将这个数组置零。

2.指针-指针

指针-指针有个前提

两个指针要指向同一个空间,并且两个指针类型相同

指针-指针的绝对值是两个指针之间的元素个数

我们看这个代码

#include<stdio.h>
int main()
{int arr[10] = { 0 };printf("%d", &arr[9] - &arr[0]);return 0;
}

运行结果为

 我们之前讲解过自己实现一个求字符串长度的解法,一种是计数器,另外一种是递归的思想,今天我们在采用一种指针-指针的方法,使用\0处的指针-起始点

代码如下

#include<stdio.h>
int my_strlen(char* arr)
{int* str = arr;while (*arr != '\0'){arr++;}return arr - str;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return 0;
}

当然,我们也可以将*,和++进行合并

#include<stdio.h>
int my_strlen(char* arr)
{int* str = arr;while (*arr++ != '\0');return arr - str - 1;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return 0;
}

3.指针的关系运算

#define N_VALUES 5
#include<stdio.h>
int main()
{float values[N_VALUES];float* vp;for (vp = &values[N_VALUES]; vp > &values[0];){*--vp = 0;}
}

这段代码与前面一段代码很相似,功能就是将数组置零。这个是先--vp然后在解引用,最终vp停留的位置就是数组元素的起点

我们在看一下这段代码

#define N_VALUES 5
#include<stdio.h>
int main()
{float values[N_VALUES];float* vp;for (vp = &values[N_VALUES - 1]; vp >= &values[0]; vp--){*vp = 0;}
}

这段代码,是将上面的*和--混用的部分代码给拆开写了。这样写确实可以实现我们的功能,但是要注意的是,第二种写法在绝大多数编译器是没有问题的,但是然而我们还是应该避免这样写,因为标准并不保证它可行。在少部分的编译器上还是会出问题的。

因为这个段代码最后会出现数组首元素的前一个地址与这个数组首元素地址进行比较。

而我们的标准是这样规定的:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。

五、 指针和数组

1.指针和数组是不同的对象

指针是一种变量,存放地址的,大小4/8字节的

数组是一组相同类型元素的集合,是可以放多个元素的,大小是取决于元素个数和元素类型的

2.数组的数组名是数组首元素的地址,地址是可以放在指针变量中

可以通过指针访问数组

比如下面的代码就可以实现指针访问数组

#include<stdio.h>
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//赋值for (i = 0; i < sz; i++){*p = i + 1;p++;}//打印p = arr;for (i = 0; i < sz; i++){printf("%d ", *p);p++;}return 0;
}

或者也可以这样写

#include<stdio.h>
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//赋值for (i = 0; i < sz; i++){*(p + i) = i + 1;   }//打印for (i = 0; i < sz; i++){printf("%d ", *(p+i));}return 0;
}

还有一点需要说明的是

我们在这里出现了

int arr[10];

int* p=arr;

这里说明arr是一个首元素地址

而地址就可以解引用。所以我们知道arr[i]--->*(arr+i)

而加法是满足交换律的,所以进而推出*(i+arr)

进而推出    i[arr]

事实上,这个确实是没有问题的,可以正常使用的,因为 [ ]他只是一个操作符,i和arr是这个操作符的操作数而已。在我们电脑里面arr[i]也会被翻译成*(arr+i)。

六、二级指针

1.什么是二级指针?

我们在之前说过的指针是这样的int* pa=&a;也就是将a的地址放入pa中,pa的类型是int*。

那么pa这个指针其实应该也有一个地址,我们如果取出他的地址,将他放入另外一个变量,这就叫做二级指针。

也就是int**ppa=&pa。其中第二颗*代表着他是一个指针,前面的int*代表着他指向的类型是一个int*类型的数据

如下代码所示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 10;int* pa = &a;int** ppa = &pa;return 0;
}

如下图示关系

2.二级指针的解引用

对于二级指针的解引用需要两颗*

有如下等式成立

**ppa==*pa=a

举个例子

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 10;int* pa = &a;int** ppa = &pa;printf("%d\n", **ppa);**ppa = 50;printf("%d\n", **ppa);return 0;
}

运行结果为

 七、指针数组

1.指针数组的概念

在这里,我们首先需要了解指针数组是数组还是指针呢?

其实,是数组,从语言的角度来思考,指针是修饰词,数组才是主语

比如字符数组,他是一个数组,里面存放的都是字符

比如整型数组,他是一个数组,里面存放的都是整型

所以我们便能猜测到,指针数组,他是一个数组,里面存放的都是指针

我们举一个例子

#include<stdio.h>
int main()
{int a = 10;int b = 20;int c = 30;int d = 40;int e = 50;int* arr[5] = { &a,&b,&c,&d,&e };int i = 0;for (i - 0; i < 5; i++){printf("%d ", *(arr[i]));}return 0;
}

运行结果为

 图解为

 2.尝试模拟一个二维数组

我们了解了指针数组的概念以后,我们可以利用其模拟一个二维数组,假设我们要模拟三行四列的二维数组

我们是这样想的,先定义出三个一维数组a,b,c。然后定义一个指针数组,令指针数组的每个元素是这些一维数组的首元素地址。然后我们就可以通过两次遍历就能模拟出来这个二维数组了

 代码如下

#include<stdio.h>
int main()
{int a[] = { 1,2,3,4 };int b[] = { 2,3,4,5 };int c[] = { 3,4,5,6 };int* arr[] = { a,b,c };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){printf("%d ", *(arr[i]+j));}printf("\n");}return 0;
}

运行结果为

当然,如果我们将*(arr[i]+j)改为arr[i][j]也是正确的,因为这两种是可以相互转换的


 总结

本节课我们主要详细讲解了指针与内存对于他们理解,指针和指针类型,指针类型的意义,野指针的成因,以及如何规避野指针,指针的三种运算,指针与数组的关系,二级指针,以及指针数组

如果对你有帮助的话,不要忘记点赞加收藏哦!!!

相关文章:

SpringBoot项目启动内存泄漏问题排查与解决

在今天的开发过程中&#xff0c;我遇到了一个SpringBoot项目启动时显示内存泄漏的问题。这个问题让我头疼了一段时间&#xff0c;但经过多次排查&#xff0c;最终成功解决了。现在我将这个过程分享给大家&#xff0c;希望能对遇到类似问题的朋友们有所帮助。 问题现象 在启动…...

179. 最大数(LeetCode)

文章目录 前言一、题目讲解二、算法原理三、代码编写1.仿函数写法2.lambda表达式 四、验证五.总结 前言 在本篇文章中&#xff0c;我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题&#xff01;&#xff01;&#xff01; 一、题目讲解 一组非负整数&#xff0c;包…...

Redis底层数据结构之SDS

目录 一、概述二、SDS结构三、为什么使用SDS redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis底层数据结构之I…...

XMU《计算机网络与通信》第四次实验报告

计算机网络 实验四 通信 这次实验的话,我的报告参考意义不大,毕竟这次实验的主要难点是完成那两个代码,但是我报告中没有任何对于代码的解释。 大家如果需要的话,我的两个代码可以在这里下载,仅供参考:点击下载。 一、个人信息 姓名:XXX 学号:XXXXXXXXXXXXXX 二、实验目…...

【javpower:后端技术革新的开源之旅】

&#x1f31f; javpower&#xff1a;探索Java后端的无限可能 在Java技术的宇宙中&#xff0c;我以代码为舟&#xff0c;以创新为帆&#xff0c;不断探索后端开发的深邃与广阔。我是javpower&#xff0c;一名对技术充满热情的实践者&#xff0c;我的旅程是通过开源项目与世界分…...

SpringCloud引入SpringBoot Admin

Spring Boot Admin可以监控和管理Spring Boot&#xff0c;能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供警报功能。 1. 创建SpringBoot工程 2. 引入相关依赖 <dependency><groupId>com.alib…...

【C语言航路】第六站:指针初阶

目录 一、指针是什么 二、指针和指针类型 1.指针类型的意义 2.指针-整数 3.指针解引用 三、野指针 1.野指针的成因 &#xff08;1&#xff09;指针未初始化 &#xff08;2&#xff09;指针越界访问 &#xff08;3&#xff09;指针指向的空间释放 2.如何规避野指针 &a…...

从 JPA 2.x 迁移到 3.0

我最近收到了很多关于JPA 3.0的问题&#xff0c;由于EclipseLink和Hibernate现在提供了对它的全面支持&#xff0c;现在是时候仔细看看规范的最新更新了。作为从Java EE到Jakarta EE转换的一部分&#xff0c;Java Persistence API&#xff08;JPA&#xff09;更名为Jakarta Per…...

Allegro如何锁定器件操作指导

Allegro如何锁定器件操作指导 Allegro上可以锁定器件,避免误操作被移动,具体操作如下 选择fix命令 Find选择Symbols 框选需要锁定的器件 可以看到器件被锁住了 除了这个方法之外,还有另外一种方法锁定器件,选择edit-property Find选择Symbols...

第三章:SpringBoot的配置文件-核心技术

目录 1、文件类型 1.1、properties 1.2、yaml 1.2.1、简介 1.2.2、基本语法 1.2.3、数据类型 1.2.4、示例 2、配置提示 1、文件类型 1.1、properties 同以前的properties用法 1.2、yaml 1.2.1、简介 YAML 是 "YAML Aint Markup Language"&#xff08;YA…...

Vue中的计算属性

计算属性&#xff1a;实际上是把vm中的属性进行计算加工&#xff0c;最后能够返回给页面一个结果&#xff0c;它是实时的&#xff0c;所以不能做异步操作。 细想一下&#xff0c;其实methods方法也能实现1中描述的现象&#xff0c;但是计算属性最大的优势是缓存&#xff01;&a…...

HTML+CSS个人电影网页设计——电影从你的全世界路过(4页)带音乐特效

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…...

业务开发时,接口不能对外暴露的解决方案

1.内外网接口微服务隔离 将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有的接口均对外暴露,另一个服务的接口只能内网服务间调用。 该方案需要额外编写一个只对内部暴露接口的微服务,将所有只能对内暴露的业务接口聚合到这个微服务里,通过这个聚合…...

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我&#xff0c;温暖你」这部剧非常火&#xff0c;讲述的是程序员的爱情故事。 其中陈飞宇饰演的男主李峋&#xff0c;在剧中用程序做出的爱心跳动效果&#xff0c;非常炫。 网上各个大佬也是纷纷给出看法&#xff0c;综合就是不太可能用C语言来实现的。 大概率是AE…...

初识猿如意开发工具

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 一、初遇猿如意 第一次听说猿如意开发工具&#xff0c;于是抱着试试的心态&#xff0c;开始下载尝试。 首先是…...

PyTorch 2.0发布了,一行代码提速76%

PyTorch 官方&#xff1a;我们这次的新特性太好用了&#xff0c;所以就直接叫 2.0 了。 前段时间&#xff0c;PyTorch 团队在官方博客宣布 Pytorch 1.13 发布&#xff0c;包含 BetterTransformer 稳定版等多项更新。在体验新特性的同时&#xff0c;不少人也在期待下一个版本的推…...

栈的基本操作

一&#xff0c;自定义函数 #include<bits/stdc.h> using namespace std; const int N 1000;//N是常量 int s[N 1];//栈 int top;//栈顶的位置(栈内有多少个元素) //入栈 void push(int x){ //非满栈 if(top < N){ //将栈顶上移并存入 top…...

windows内核编程-文件操作

文章目录前言背景知识点介绍字符串内存分配与回收文件操作自旋锁win内核编程-日志实现文件操作的封装日志功能的实现简单的测试日志功能其他前言 本文完整代码见&#xff1a;demo/12-win-driver-log 我们必须先搞定&#xff0c;DebugView可以看到DbgPrintDbgPrint的输出。否则…...

Hadoop原理与技术——Linus命令行基本操作

点击链接查看文档 一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 J…...

目标检测算法——YOLOv5/YOLOv7改进之结合特征提取网络RFBNet(涨点明显)

>>>深度学习Tricks,第一时间送达<<< 🚀🚀🚀NEW!!!魔改YOLOv5/v7目标检测算法来啦 ~ 计算机视觉——致力于目标检测领域科研Tricks改进与推荐 | 主要包括Backbone、Neck、Head、普通注意力机制、自注意力机制Transformer、Swin Transformer v2,各…...

anaconda使用系列教程--4)环境迁移

概述 跨平台尽量避免&#xff0c;比如windows和linux就不要跨平台&#xff0c;就在linux之间跨还是可以的 直接copy整体环境文件&#xff0c;适合于无法联网或网速不佳的新环境 anaconda最好是同版本的 迁移方法 使用requirement文件 A机器&#xff1a; pip freeze > …...

Kotlin高仿微信-第57篇-VIP管理列表

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…...

贪心算法-- 纪念品分组

问题描述元旦快到了&#xff0c;校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值 相对均衡&#xff0c;他要把购来的纪念品根据价格进行分组&#xff0c;但每组最多只能包括两件纪念品&#xff0c;并且每组纪念品的价格之和不能超过一个给…...

java-php-net-python-代驾网站计算机毕业设计程序

java-php-net-python-代驾网站计算机毕业设计程序 java-php-net-python-代驾网站计算机毕业设计程序本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&#xff1a;Layui、HTML、CSS、JS、JQ…...

简洁自增ID实现方案

简介 从数据库性能角度考虑&#xff0c;我们经常需要数字型的自增主键&#xff0c;有时候我们并不想用像MySQL自带的自增&#xff0c;因为从1开始很数据位数不一样&#xff0c;对有点强迫症的人来说&#xff0c;不是很友好。 另外&#xff0c;别人也容易根据这种从1开始的自增…...

JMeter入门教程(14)——场景设计

1.JMeter中场景设计是通过线程组来实现的 如图&#xff1a; 控制面板中各元素介绍&#xff1a; 名称&#xff1a;可以随意设置&#xff0c;最好有业务意义。 注释&#xff1a;可以随意设置&#xff0c;可以为空。 在取样器错误后要执行的动作&#xff1a;其中的某一个请求出错后…...

SVM 用于将数据分类为两分类或多分类(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…...

转行软件测试我后悔了

很多时候&#xff0c;都在想当初做的转行软件测试行业的决定是对的吗&#xff1f;现在后悔还来得及吗&#xff1f; 记得在求职的时候&#xff0c;面试官经常问我&#xff1a;“为什么要选择软件测试工作?” 而我也会经常说一堆自己有的没的优势去应付。 工作这么久了&#x…...

k8s教程(15)-pod之亲和性与互斥性调度

文章目录01 引言02 pod亲和性调度与互斥性调度2.1 拓扑域2.2 举例2.2.1 参照目标pod2.2.2 pod的亲和性调度2.2.3 pod的互斥性调度03 其它04 文末01 引言 声明&#xff1a;本文为《Kubernetes权威指南&#xff1a;从Docker到Kubernetes实践全接触&#xff08;第5版&#xff09;》…...

浅谈降维实操,一种用于处理特征的方式——后附Python代码

&#x1f466;&#x1f466;一个帅气的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 降维实操前言线性降维低…...

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…...

数据结构(王卓)(4)附:链表的销毁与清空

销毁 Status 销毁单链表(LinkList L) {LinkList p;while (L){p L;L->next;delete p;}return OK; } 运行逻辑&#xff1a; &#xff08;1&#xff09;:设定一个指针&#xff0c;让指针指向链表的头指针L &#xff08;2&#xff09;&#xff1a;让头指针等于头指针里面指向下…...

C++图书管理系统(管理员-读者)

C图书管理系统&#xff08;管理员-读者&#xff09; 一、设计一款文字式交互的图书管理系统&#xff0c;要求具备注册登录、浏览图书、借还图书等基本功能&#xff1b; 二、要求以外部文件的形式存储书籍信息、馆藏记录、借阅记录、用户信息等。【可参考提供的书籍清单】 三…...

永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现

文章目录前言一、 恒压频比&#xff08;V/F&#xff09;控制原理二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1.恒压频比控制算法2.1.2.输出处理2.1.3.主电路2.2.仿真结果分析2.2.1.设定目标转速为1200r/min2.2.1.设定目标转速为变化值三…...

基于JSP网上书城的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

java计算机毕业设计-学生宿舍故障报修管理信息系统-源程序+mysql+系统+lw文档+远程调试

java计算机毕业设计-学生宿舍故障报修管理信息系统-源程序mysql系统lw文档远程调试 java计算机毕业设计-学生宿舍故障报修管理信息系统-源程序mysql系统lw文档远程调试本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xf…...

vue学习笔记——简单入门总结(四)

文章目录1.Vue3的特性和变化1.1.创建vue3项目1.2.分析main.js变化&#xff1a;1.3.setup--组合式api的开端1.4.ref函数和reactive函数&#xff1a;1.5.watch监视属性1.5.watchEffect函数1.6.vue3生命周期&#xff1a;1.Vue3的特性和变化 1.1.创建vue3项目 1.这里我们使用脚手架…...

数据结构与算法—数组栈和链表栈

数据结构与算法—数组栈和链表栈 &#x1f308;一览众山小数据结构与算法—数组栈和链表栈栈介绍栈图解栈实现数组实现栈实现思路实现代码单链表实现栈实现思路(图解)实现代码栈总结栈力扣栈介绍 栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站&#xff0c;所以引入到计算…...

【应用】Kubernetes

Kubernetesk8s 安装流程安装前配置安装 docker 以及 k8s 组件初始化 k8s 集群测试使用&#xff1a;安装 kubernetes-dashboardk8s 基础概念k8s 核心技术概念k8s 内部组件k8s 中的 IP 地址K8S 服务暴露的三种方式k8s 安装流程 k8s-masterk8s-node01k8s-node02192.168.86.140192…...

GEE:关系、条件和布尔运算

ee.Image对象具有一组用于构建决策表达式的关系、条件和布尔运算方法。这些方法可以用来掩膜、绘制分类地图和重新赋值。 本文记录了在GEE&#xff08;Google Earth Engine&#xff09;平台上的关系运算符和布尔运算符&#xff0c;分别应用到了三个不用的场景&#xff08;筛选低…...

Java项目:SSM的KTV管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 主要功能包括&#xff1a; 登陆页,房间信息,房间管理,开取房间,房间查询,会员管理,食物管理,查看订单,查询订单,查看房间消费使用情况等功能。…...

包装类-Wrapper

包装类的分类 针对八种基本数据类型相应的引用类型-包装类有了类的特点&#xff0c;就可以调用对应的类中的方法 装箱和拆箱 Java是一种面向对象的编程语言&#xff0c;学习Java时就被明确灌输了一个概念&#xff1a;OOP&#xff0c;即面向对象编程。一切皆对象。但是基本…...

计算机网络——运输层【重点】

运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时&…...

ADSP-21569/ADSP-21593的开发入门(上)

作者的话 ADI的SHARC系列DSP&#xff0c;目前已经出到5系列了&#xff0c;最新的一颗叫2159x&#xff0c;按照ADI的说法&#xff0c;这颗DSP的性能是21569的两倍&#xff0c;但又能和21569做P2P的替换&#xff0c;所以下面我们就以21593为例&#xff0c;写一点资料&#xff0c…...

【Android App】在线直播之搭建WebRTC的服务端(图文解释 简单易懂)

有问题或需要源码请点赞关注收藏后评论区留言私信~~~ 一、WebRTC的系统架构 WebRTC&#xff08;网页即时通信&#xff09;是一个支持浏览器之间实时音视频对话的新型技术&#xff0c;WebRTC体系由应用于实时通信的编程接口和一组通信协议组成&#xff0c;已成为互联网流媒体通…...

x265 帧间预测

帧间编码入口函数&#xff1a; 从 Analysis::compressCTU 是ctu编码的入口函数&#xff0c;根据 slice 类型判断是 I 还是 BP&#xff0c;如果是BP则执行帧间编码函数 Analysis::compressInterCU_rdx_x&#xff1a;&#xff1a;/*压缩分析CTU过程&#xff1a;1.为当前CTU加载QP…...

【sciter】安全应用列表控件总结

一、效果图 二、功能点 实现电脑文件拖拽进入到安全桌面,读取文件路径,生成应用。可以配置允许拖拽进入安全桌面的文件应用。点击添加图标,可以添加应用到安全桌面中。在安全桌面列表中每一个应用实现双击、失去焦点,获取焦点、右键事件在安全桌面列表中每一个应用可以实现…...

一篇文章让你搞懂Java顺序表

目录 一、 线性表的基本介绍 二、顺序表 1、顺序表的概念 2. 创建顺序表类&#xff08;ArrayList&#xff09; 2. 增加元素 3. 删除元素 4. 修改某个元素 5. 查找元素 Main类 在数据结构体系中我们将整个数据结构分为两类&#xff0c;一类是线性结构&#xff1b; 线性…...

小白必知必会的几个IP协议知识

小白必知必会的几个IP协议知识1.IP地址属于网络层协议2.路由控制3.数据链路的抽象化4.IP属于面向无连接型1.IP地址属于网络层协议 在计算机通信中&#xff0c;为了识别通信对端&#xff0c;必须要有一个类似于地址的识别码进行标识。 MAC地址是用来标识同一个链路中不同计算机…...

【45-线程的实现方式-线程池的创建方式-线程池的执行顺序-CompletableFutrue异步处理】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…...

前馈神经网络与支持向量机实战 --- 手写数字识别

前馈神经网络与支持向量机实战 — 手写数字识别 文章目录前馈神经网络与支持向量机实战 --- 手写数字识别一、前馈神经网络介绍二、支持向量机介绍三、数据集说明四、环境准备五、实验要求六、Python代码tutorial_minst_fnn-keras.py&#xff1a;使用TensorFlow的Sequential实现…...

idea导入eclipse项目的时候,Java图标变成黄色小J了,怎么解决?

凯哥今天导入一个15年时候写的小项目&#xff0c;当时使用的是eclipse写的。最近好几年都在使用idea&#xff0c;习惯了idea的&#xff0c;在用eclipse&#xff0c;不习惯&#xff0c;不顺手&#xff0c;就导入到idea中。发现&#xff0c;Java文件的图标变成了黄色的J。如下图&…...

Redis配置与优化

1 关系数据库与非关系型数据库概述 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上 一般面向于记录 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言 用于执行对关系型数据库中…...

管理团队相关的梳理

管理团队是跟踪团队成员工作表现,提供反馈,解决问题并管理团队变更,以优化项目绩效的过程。本过程的主要作用是,影响团队行为、管理冲突以及解决问题等方式,实现团队管理。 输入 1.项目管理计划 --------资源管理计划 2. 项目文件 --------问题日志、经验教训登记册、项…...

HTML5期末大作业【红色的电影售票平台网站】web前端 html+css+javascript网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…...

【三维目标检测】Part-A2(一)

Part-A2是商汤在CVPR 2020上发布的三维点云目标检测模型&#xff0c;来源于PointRCNN同一作者&#xff0c;论文名称《From Points to Parts 3D Object Detection from Point Cloud with Part-aware and Part-aggregation Network》。从名称可以看出&#xff0c;Part代表的是目标…...

艾体宝案例 | 使用Redis和Spring Ai构建rag应用程序

随着AI技术的不断进步&#xff0c;开发者面临着如何有效利用现有工具和技术来加速开发过程的挑战。Redis与Spring AI的结合为Java开发者提供了一个强大的平台&#xff0c;以便快速构建并部署响应式AI应用。探索这一整合如何通过简化的开发流程&#xff0c;让开发者能够更专注于…...

抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth deny

这是因为 当前小程序没有获取 手机号的 权限 此能力仅支持小程序通过试运营期后可用&#xff0c;默认获取权限&#xff0c;无需申请&#xff1b; https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/open-capabilities/acquire-phone-number-acqu…...

部署接入 M3E和chatglm2-m3e文本向量模型

前言 FastGPT 默认使用了 openai 的 embedding 向量模型,如果你想私有部署的话,可以使用 M3E 向量模型进行替换。M3E 向量模型属于小模型,资源使用不高,CPU 也可以运行。下面教程是基于 “睡大觉” 同学提供的一个的镜像。 部署镜像 m3e-large-api 镜像名: stawky/m3e-…...

JVM(Java虚拟机)功能特点、垃圾回收机制

简介 JVM&#xff08;Java虚拟机&#xff09;是一种虚拟的计算机执行环境&#xff0c;用于执行Java字节码。Java虚拟机不仅仅用于执行Java语言编写的程序&#xff0c;还可以执行其他编译成Java字节码的语言&#xff08;如Kotlin、Scala等&#xff09;编写的程序。JVM的主要目标…...

记录wordpress网站搭建及当天被SEO优化收录

网站是前不久搭建的&#xff0c;但是一直没有做SEO优化&#xff0c;今天花了点时间做下优化。记录下&#xff0c;喜欢的朋友点赞收藏下。 1.wordpress后台下载插件Yoast SEO插件&#xff0c;setting中搜索XML sitemaps&#xff0c;点view the XML sitemap&#xff0c;暂时不关…...

sql中开窗函数的使用

窗口函数 普通的聚集函数只能用来计算一行内的结果&#xff0c;或者把所有行聚集成一行结果。而窗口函数可以跨行计算&#xff0c;并且把结果填到每一行中。 •通过查询筛选出的行的某些部分&#xff0c;窗口调用函数实现了类似于聚集函数的功能&#xff0c;所以聚集函数也可以…...