深入理解指针(二)
深入理解指针(二)
- 前言:
- 一、const修饰指针
- 1.const修饰变量
- 2.const修饰的指针变量
- 二、野指针
- 1.野指针的成因
- (1).指针的未初始化
- (2).指针的越界访问
- (3).指针的空间释放
- 2.如何规避野指针
- (1).指针初始化
- (2).小心访问越界
- (3)指针不再使用的时候,及时置NULL,指针使用之前检查有效性
- (4)避免返回局部变量的地址(函数)(栈空间)
- 三、assert断言
- 四、指针的使用和传址调用
- 1.strlen的模拟实现
- 2.指针的传址调用与传值调用
前言:
一、const修饰指针
1.const修饰变量
在C语言中,const修饰的变量是为常变量,常变量具有常属性,所以不能随意改变值。
#include<stdio.h>
int main()
{const int a = 10;//这时候表示a的本质是不希望被改变的//这时候a被const修饰,a变成了常变量,但是本质还是变量,所以不能改变。a = 1;printf("%d\n", a);int*p = &a;*p = 20;printf("%d ", a);//通过解引用操作改变了赋值在C++中:const int n = 0;这里的n是常量,不是常变量。return 0;
}
所以我们可以用解引用操作去修改常变量的值
2.const修饰的指针变量
const可以放在*左边和右边,都是可以去限制p的变化
//左边:
const int* p = &a;
int const* p = &a;
//这两个是一样
//右边:int* const p = &a;
#include<stdio.h>
int main()
{int a = 100;int* pa = &a;//pa是一个指针变量,里面存入的是地址。*pa = 0;//*pa是pa的指向对象(a)printf("%d\n", a);printf("%d\n", *pa);return 0;
}
下面是我对于它们的理解:
代码示例:
理解1:在左边时,const限制的是*p,即指向的内容无法改变,但是通过改变指针变量本身内容去进行改变
#include<stdio.h>
int main()
{int a = 100;int b = 1000;const int* p = &a;//*p = 0;//errp = &b;//okprintf("%d",*p);return 0;
}
理解2:在右边时,修饰的是指针变量本身p,所以指针变量本身不能被修改,指针指向的内容是可以根据指针来进行改变
注意:此时一定要对指针变量进行初始化
#include<stdio.h>
int main()
{int a = 100;int b = 1000;int* const p = &a;*p = 0;//ok//p = &b;//errprintf("%d\n", a);return 0;
}
二、野指针
野指针的概念:野指针就是指针所指向的位置是随机的(没有明确的限制)。
1.野指针的成因
(1).指针的未初始化
#include<stdio.h>
int main()
{int* p;//局部变量不初始化的时候,里面存放的是随机值*p = 20;//这时候属于非法访问。return 0;
}
(2).指针的越界访问
#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 0; i <= sz; i++){//因为这个循环本身能循环11次,当循环第11次的时候//p指向了数组最后一个元素后面的空间,这时候就存在非法访问的问题*p = i;//*p是指向的对象,即i;p++;//p本身在移动,这时候的p是指针变量的本身//*(p++) = i;也可以这么去写。}return 0;
}
便会出现如上的这种错误。
(3).指针的空间释放
在这同时p既得到了地址,又是野指针
#include<stdio.h>
int* test()
{int n = 100;//n所占的是4个字节,但是因为它是局部变量,所以出了作用域会销毁。//所以也表明它的空间也会还给操作系统return &n;
}
int main()
{int* p = test();//但是它还给了操作系统的同时,指针变量的p也接收到了n的地址。printf("%d\n", *p);//这时候虽然会打印出结果,但是会形成了非法访问内存的结果。return 0;
}
2.如何规避野指针
(1).指针初始化
NULL为空指针
如果指针有明确的指向,那就直接赋给明确的地址。
int a = 10;
int* p = &a;
如果指针变量,当前还不知道该指向哪里,这个时候应初始化为NULL;
当然这个时候也是无法进行使用的,比如通过解引用。
#include<stdio.h>
int main()
{int* p = NULL;//这个时候就是NULL为空指针//*p = 200;//想要使用它,就必须绕过NULL,即当它不等于NULL时候可以去使用,否则会非法访问内存。if (p != NULL){*p = 200;}return 0;
}
(2).小心访问越界
一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。
防止指针在使用的时候访问而超过原有值的边界。
(3)指针不再使用的时候,及时置NULL,指针使用之前检查有效性
如果NULL指针就可以不去访问,并且在用指针时还可以起到判断指针是否为NULL
#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;for (i = 0; i < 10; i++){*(p++) = i;}//此时p已经越界了,可以把p置为NULLp = NULL;//下次使用p的时候,判断p不为NULL的时候再使用//...p = &arr[0];//重新让p获得地址if (p != NULL) //判断{//...}return 0;
}
理解: 指针在用完这块区域的时候,后期我们不用这块区域(空间)的时候,我们可以把指针置为NULL。
在下次还要使用这个指针,再把地址赋值后,需要判断这个指针还是不是NULL类型即可。
(4)避免返回局部变量的地址(函数)(栈空间)
#include<stdio.h>
int* test()
{int n = 100;return &n;//局部变量的地址,容易出现野指针
}
int main()
{int* p = test();printf("%d\n", *p);return 0;
}
三、assert断言
作用:判断指针是否为空
要想使用assert必须要使用assert头文件
#defeine NDEBUG是可以在assert头文件前使用,可以起到关闭assert的作用。
当已经确认了程序已经没有了问题,便可以用这个宏定义
想要开启时,把这个宏定义注释掉即可
//#define NDEBUG
#include<assert.h>
int main()
{int arr[5] = { 1,2,3,4,5 };//int* p = arr;int* p = NULL;assert(p != NULL);//验证指针变量是否为NULL,若不是,则为程序继续运行,//若是,则会终止运行,并且给出信息错误的提示for (int i = 0; i < 5; i++){printf("%d ", *(p + i));}return 0;
}
#include<stdio.h>
#include<assert.h>
int main()
{int arr[5] = { 1,2,3,4,5 };int* p = arr;//int* p = NULL;assert(p != NULL);//验证指针变量是否为NULL,若不是,则为程序继续运行,//若是,则会终止运行,并且给出信息错误的提示for (int i = 0; i < 5; i++){printf("%d ", *(p + i));}return 0;
}
assert()的使用是对于程序员是有很大的好处的
好处:能够精确快速发现错误,并找到问题所在位置。可以用于测试和调试,并且可以增强代码的维护性。
劣势:
在Debug版本中assert能帮程序员在代码运行时检查错误,发现代码里的问题,方便修改和优化。但这些功能会让程序运行速度变慢,占用更多资源。
Release版本是面向用户的最终版本,关闭了调试功能,把 assert 优化掉了。它更注重程序运行效率和性能,运行速度更快,占用资源更少。
四、指针的使用和传址调用
1.strlen的模拟实现
上一节我们已经写过了strlen函数的模拟实现,现在用这节知识优化一下
代码如下:
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* s)//const防止被修改
{int count = 0;assert(s != NULL);//防止被为空指针while (*s != '\0'){count++;s++;}return count;
}
int main()
{char arr[] = "abcdef";size_t c = my_strlen(arr);printf("%zd\n", c);return 0;
}
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{const char* start = str;assert(str != NULL);while(*str){str++;}return str - start;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d ", len);return 0;
}
2.指针的传址调用与传值调用
这应该是一份交换两个变量的值的函数:
#include<stdio.h>
int Swap(int x, int y)
{int temp = 0;temp = x;x = y;y = temp;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap(a, b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}
但是结果令人出乎意料:打印完的值是没有交换。
通过调试我们可以看到:
Swap函数中x,y接收了a,b的值,两组的内存地址也分别不同,那么就也说明了两组是不同的且独立的空间,所以在Swap函数中交换x和y的值,再回到main函数中,那么不会对main函数的a和b的值会造成影响。
这种是把变量的本身传递给函数,叫做传值调用
原因:实参传递给形参时,形参是实参的一份临时拷贝,因为形参会再创造一个独立的空间,所以对于形参的修改不会影响到实参。
既然这么做不能交换,那么我们把a和b的地址传递给这个函数,去试一试。
#include<stdio.h>
int Swap2(int* px, int* py)
{//*py等于b;*px等于aint temp = 0;temp = *px;*px = *py;*py = temp;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap2(&a, &b);//传址调用,传进去的是地址printf("交换后:a=%d b=%d\n", a, b);return 0;
}
这时候我们再通过调试看一看:
这时候把地址传递给了函数,变量储存的是地址,我们可以去进行交换了。
这种把地址传递给函数,再去调用的方式叫做传址调用。
传址调用是把函数与主调函数构成真正的联系,在函数内部可以修改主调函数的变量。
一般来说只是去调用变量的值去进行计算的这种用传值调用;
需要改变主调函数中的变量等,这时候需要传址调用。
相关文章:
深入理解指针(二)
深入理解指针(二) 前言:一、const修饰指针1.const修饰变量2.const修饰的指针变量 二、野指针1.野指针的成因(1).指针的未初始化(2).指针的越界访问(3).指针的空间释放 2.如何规避野指针(1).指针初始化(2).小心访问越界(3)指针不再使用的时候&…...
非华为电脑制作一碰传NFC贴纸
前提: 在笔记本上安装好华为电脑管家,可以在 github 上下载,并测试可以正常和手机或平板连接步骤: 1、打开电脑华为电脑管家,点【快捷服务】,记录下序列号,一般安装后会生成16位的序列号 2、…...
Wpf美化按钮,输入框,下拉框,dataGrid
Wpf美化按钮,输入框,下拉框,dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…...
Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!
在现代职场中,Office办公套件已成为工作和学习的必备工具,其功能强大但复杂,熟练掌握需要系统的学习。为了简化操作,使每个人都能轻松使用各种功能,市场上涌现出各类办公插件。这些插件不仅提升了用户体验,…...
【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)
目录 一、引言 二、MMoE(Multi-gate Mixture-of-Experts,多门混合专家网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、…...
git submodule使用
git submodule 用于关联其他独立的仓库。 它有着几点好处: 代码复用:可以将工具代码放到单独的仓库,再通过 submodule 关联。模块化开发:可以将项目拆分成多个模块,每个模块设置单独仓库独立开发,再通过 su…...
朝天椒USB服务器:解决加密狗远程连接
本文探讨朝天椒USB服务器用Usb Over Network技术,解决加密狗在虚拟机、云主机甚至异地的远程连接问题。 在企业数字化转型的浪潮中,加密狗作为防止软件盗版的重要手段,广泛应用于各类软件授权场景。然而,随着企业超融合进程不断加…...
[笔记.AI]deepseek-r1的不同版本(满血版、蒸馏版、量化)
满血版:是原始的高性能模型; 蒸馏版(Distill):是指将大型模型(教师模型)的知识转移到较小的模型(学生模型)中,以保持性能的同时减少计算资源的需求࿱…...
Kokoro 开源文本转语音引擎上线!多语言支持,无需联网,浏览器内极速运行
Kokoro 是一款轻量级的开源文本转语音(TTS)引擎,凭借其高效能和轻量化设计,迅速在技术社区中引起关注。本文将详细介绍 Kokoro 的主要特点,并提供在浏览器和 Python 环境中的代码示例,帮助您快速上手。 1. Kokoro:可在浏览器中运行的 TTS 引擎 1.1 简介 Kokoro 是一个…...
Unity 基础编程
在这个练习中将新建unity脚本,控制player的运动与转动,实现用代码检测碰撞与删除物体。 该练习将应用附件中的项目文件,该文件与Unity快速练习的文件是同一个项目文件。 一、构建Player运动脚本 该部分将构建一个在场景中由玩家控制游戏物…...
CTFHub-RCE系列wp
目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞,全称是Remote Code Execution漏洞,翻译成中文…...
基于YoloV11和驱动级鼠标模拟实现Ai自瞄
本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是,本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为,包括但不限于在各类游戏中实施作弊等违规操作。若因违…...
基于微信小程序的博物馆预约系统的设计与实现
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
R语言LCMM多维度潜在类别模型流行病学研究:LCA、MM方法分析纵向数据
全文代码数据:https://tecdat.cn/?p39710 在数据分析领域,当我们面对一组数据时,通常会有已知的分组情况,比如不同的治疗组、性别组或种族组等(点击文末“阅读原文”获取完整代码数据)。 然而,…...
python卷积神经网络人脸识别示例实现详解
目录 一、准备 1)使用pytorch 2)安装pytorch 3)准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1)导入库 2)数据预处理 3)加载数据 4)构建一个卷积神经网络 5࿰…...
如何把邮件批量导出到本地
最近遇到邮箱满了的问题,需要把邮件批量导出到本地,然后清空邮箱。 问题是这个邮箱的官网,没有批量导出按钮,比较麻烦;总不能一封一封下载到本地,上万的。 找到了一个好用的工具,Mozilla Thun…...
C++智能指针的使用
文章目录 智能指针的使用和原理智能指针的使用场景RAII和智能指针C标准库智能指针的使用 智能指针的使用和原理 智能指针的使用场景 1. 下面的程序中,new了以后,我们也delete了,但是因为抛异常导致后面的delete没有得到执行,所以…...
Docker安装Redis
一、保证Docker提起来了 systemctl status docker想这没有启动要先启动一下 systemctl status docke二、拉取Redis(默认拉最新版) sudo docker pull redis检查一下拉成功没有 docker images三、创建相关目录 mkdir -p /home/redis/{conf,data}四、…...
深入理解MySQL索引底层数据结构
文章目录 前言一、MySQL索引是什么?二、索引的核心需求三、MySQL为什么选择BTree做为数据结构1.如果使用的是Hash 做为数据结构2.如果使用二叉树做为数据结构3.使用红黑树做为数据结构4.使用B-Tree做为数据结构5.BTree做为数据结构 4.BTree深度剖析结构特性与 B-Tre…...
udp和tcp的区别
目录 UDP 和 TCP 的区别 1. 连接性 2. 可靠性 3. 数据传输顺序 4. 流量控制和拥塞控制 5. 效率 6. 应用场景 UDP 和 TCP 的 C/C 代码实现区别 1. TCP 服务器端和客户端 TCP 服务器端(Server) TCP 客户端(Client) 2. U…...
VMware 虚拟机 ubuntu 20.04 扩容工作硬盘
一、关闭虚拟机 关闭虚拟机参考下图,在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …...
MapReduce是什么?
MapReduce 是一种编程模型,最初由 Google 提出,旨在处理大规模数据集。它是分布式计算的一个重要概念,通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段:Map 阶段和 Reduce 阶段。 Map 阶段&a…...
跨越边界,大模型如何助推科技与社会的完美结合?
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 概述 2024年,大模型技术已成为人工智能领域的焦点。这不仅仅是一项技术进步,更是一次可能深刻影响社会发展方方面面的变革。大模型的交叉能否推动技术与社会的真正融合?2025年…...
计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
RK3568平台开发系列讲解(ConfigFS篇)ConfigFS核心数据结构
🚀返回专栏总目录 文章目录 一、数据结构二、结构体关系三、案例3.1、configfs_subsystem 实例3.2、config_group 实例化四、属性和方法五、config_item实例化沉淀、分享、成长,让自己和他人都能有所收获!😄 理解 ConfigFS 的核心数据结构对于深入使用和定制 ConfigFS 非…...
【04】RUST特性
文章目录 隐藏shadowing所有权ownership堆区&栈区所有权规则变量&数据Copy Trait与Drop TraitCopy TraitDrop Trait移动克隆函数参数与返回值的所有权参数引用可变引用悬垂引用slice生命周期隐藏shadowing 有点像同名覆盖 let mut guess = String::new();let guess: u3…...
c语言函数学习
C语言函数学习笔记:从入门到实践 一、什么是函数? 函数是C语言中用于封装特定功能的代码块,是模块化编程的核心。通过函数可以实现: 代码复用:避免重复编写相同逻辑 逻辑清晰:将复杂程序分解为多个小模块…...
LSTM的介绍
网上一些描述LSTM文章看的云里雾里,只是介绍LSTM 的结构,并没有说明原理。我这里用通俗易懂的话来描述一下。 我们先来复习一些RNN的核心公式: h t t a n h ( W h h t − 1 W x x t b h ) h_t tanh(W_h h_{t-1} W_x x_t b_h) httan…...
XML DOM
XML DOM XML DOM(Document Object Model)是一种用于访问和操作XML文档的标准方式。它提供了一种树形结构来表示XML文档,使得开发者能够方便地对XML数据进行读取、修改和操作。本文将详细介绍XML DOM的基本概念、结构、操作方法以及应用场景。 一、XML DOM的基本概念 XML …...
认识网络安全
一 网络攻击链 踩点-工具准备-载荷投递-漏洞利用-释放载荷-建立通道-目标达成 简化下: 目标侦察:准确识别目标,收集目标详细信息,比如 网络、 邮箱、员工、社会关系、对外提供服务、漏洞 信息等,为 后续攻击做准备。…...
华为支付-免密支付接入签约代扣场景开发步骤
一、预签约(服务器开发) 1.开发者按照商户模型调用预直连商户预签约或服务商预签约接口获取preSignNo构建签约信息参数contractStr。 为保证支付订单的安全性和可靠性需要对请求body和请求头PayMercAuth对象内的入参排序拼接进行签名。请参考排序拼接和…...
9.JVM-方法区
前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person&a…...
【Linux Oracle】杂货铺 日常实用2024
1.跨服务器移动文件 passwd=^T^bxxxx `/usr/bin/expect <<-EOF set timeout -1 spawn scp -r ${BATCH_TIME} sxnhtc@192.168.3.x:${EXP_MCRO_DIR}/ expect "*password:" send "$passwd\r" interact expect eof EOF` curl -k -X GET https://192.16…...
深入理解指针初阶:从概念到实践
一、引言 在 C 语言的学习旅程中,指针无疑是一座必须翻越的高峰。它强大而灵活,掌握指针,能让我们更高效地操作内存,编写出更优化的代码。但指针也常常让初学者望而生畏,觉得它复杂难懂。别担心,本文将用通…...
Git 与 Git常用命令
Git 是一个开源的分布式版本控制系统,广泛用于源代码管理。与传统的集中式版本控制系统不同,Git 允许每个开发者在本地拥有完整的代码库副本,支持离线工作和高效的分支管理。每次提交时,Git 会对当前项目的所有文件创建一个快照&a…...
jupyterLab插件开发
jupyter lab安装、配置: jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…...
IDEA+DeepSeek让Java开发起飞
1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台,第一次需要注册一个账号 进去之后需要创建一个API KEY,然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址,点击左边的:接口…...
机器学习数学基础:19.线性相关与线性无关
一、线性相关与线性无关的定义 (一)线性相关 想象我们有一组向量,就好比是一群有着不同“力量”和“方向”的小伙伴。给定的向量组 α ⃗ 1 , α ⃗ 2 , ⋯ , α ⃗ m \vec{\alpha}_1, \vec{\alpha}_2, \cdots, \vec{\alpha}_m α 1,α 2…...
快速集成DeepSeek到项目
DeepSeek API-KEY 获取 登录DeekSeek 官网,进入API 开放平台 2. 创建API-KEY 复制API-KEY进行保存,后期API调用使用 项目中集成DeepSeek 这里只展示部分核心代码,具体请查看源码orange-ai-deepseek-biz-starter Slf4j AllArgsConstructo…...
Rocketmq 和 Rabbitmq ,在多消费者的情况下,可以实现顺序消费吗
在多消费者的情况下,RocketMQ 和 RabbitMQ 都可以实现顺序消费,但它们的实现机制和适用场景有所不同。以下是对两者的详细分析和对比: 1. RocketMQ 的顺序消费 1.1 实现机制 顺序消息:RocketMQ 支持顺序消息(Orderly …...
linux下安装【流媒体】SRS之安装与使用
一、 安装srs 这个是一个流媒体服务器。 1.1 github 获取源码 git clone https://github.com/ossrs/srs.git 或者下载国内的 git clone https://gitee.com/ossrs/srs 进去之后下载zip的 #直接使用当前最新的6.0release版本 ,我下载的是zip的 下载了之后上传到…...
Qt QSettings用法
一、概述 QSettings类是Qt框架中的一个重要类,它主要用于存储和访问应用程序的设置和配置。 二、QSettings的构造方式 1、基于组织名和程序名的构造方式(主要用于Windows注册表) 1、explicit QSettings(const QString &organization,c…...
python学opencv|读取图像(六十)先后使用cv2.erode()函数和cv2.dilate()函数实现图像处理
【1】引言 前序学习进程中,先后了解了使用cv2.erode()函数和cv2.dilate()函数实现图像腐蚀和膨胀处理的效果,相关文章链接为: python学opencv|读取图像(五十八)使用cv2.erode()函数实现图像腐蚀处理-CSDN博客 pytho…...
【大数据安全分析】大数据安全分析技术框架与关键技术
在数字化时代,网络安全面临着前所未有的挑战。传统的网络安全防护模式呈现出烟囱式的特点,各个安全防护措施和数据相互孤立,形成了防护孤岛和数据孤岛,难以有效应对日益复杂多变的安全威胁。而大数据分析技术的出现,为…...
[笔记.AI]Deepseek-R1 各参数版本的蒸馏模型对比
备注:信息主要通过Deepseek-R1获得(查询近一个月的在线资料并整理),然后我进行了相应整合。如有错误,希望指出,谢谢。 Deepseek-R1 蒸馏模型 对比维度1.5B7B8B14B32B70B 特有的突破性能力▸ 毫秒级响应(0.3…...
JAVA面向对象2(三大特征)
面向对象的三大特征:封装、继承、多态 封装: 封装,英文单词Encapsulation。 从广义的角度来说,将一块经常要使用的代码片段,定义到方法中,是封装。将多个方法和多个状态数据定义到类体中,也是一…...
Spring Cloud工程完善
目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…...
AI大模型随机初始化权重并打印网络结构方法(以Deepseekv3为例,单机可跑)
背景 当前大模型的权重加载和调用,主要是通过在HuggingFace官网下载并使用transformer的库来加以实现;其中大模型的权重文件较大(部分>100GB),若只是快速研究网络结构和数据流变化,则无需下载权重。本文…...
介绍下SpringBoot常用的依赖项
Spring Boot 是一个用于快速开发 Spring 应用程序的框架,它通过自动配置和依赖管理简化了开发过程。以下是一些 Spring Boot 项目中常用的依赖项: 1. Spring Boot Starter Web 作用: 用于构建 Web 应用程序,包括 RESTful 服务。依赖项: spr…...
第四节 docker基础之---dockerfile部署JDK
本地宿主机配置jdk 创建test目录: [rootdocker ~]# mkdir test 压缩包tomcat和jdk上传到root/test目录下: 本机部署Jdk 解压jdk: [rootdocker test]# tar -xf jdk-8u211-linux-x64.tar.gz [rootdocker test]# tar -xf apache-tomcat-8.5.…...