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

解码C语言指针

一、指针的定义与本质

1. 指针是什么?

指针是一种 存储变量内存地址 的特殊变量。所有数据存储在内存中,每个内存单元都有唯一地址(编号),指针通过记录地址实现对数据的间接访问。

2. 指针的核心作用

  • 直接操作内存:动态内存分配、硬件编程等。
  • 提高效率:传递大对象时避免复制(如结构体)。
  • 灵活数据结构:实现链表、树、图等动态结构。

二、指针基本语法

1. 声明指针

数据类型 *指针变量名;// *表示这是个指针变量

示例

int *p;// p指向int类型变量
char *str;// str指向char类型变量

2. 指针初始化

  • 取地址操作符 &:获取变量的内存地址。

    int num = 10;
    int *p = #// p指向num的地址
    
  • 直接赋值(需确保地址合法):

    int *p = (int *)0x00007FFF1234;// 避免直接操作未知地址
    

三、指针的解引用

  • 解引用操作符 * :通过指针访问或修改目标地址的数据。

    int num = 10;
    int *p = #printf("num的值 = %d\n", *p);// 输出10(访问值)
    *p = 20;// 修改num为20
    

四、指针的算术运算

指针的加减操作以 数据类型大小 为单位进行偏移。

1. 指针与整数运算

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;// p指向arr[0]p++;// p指向arr[1](地址+4字节,假设int为4字节)
printf("%d\n", *p);// 输出2p += 3;// p指向arr[4]
printf("%d\n", *p);// 输出5

2. 指针之间的减法

计算两个指针之间的元素距离(同类型指针):

int *p1 = &arr[0];
int *p2 = &arr[4];
printf("距离 = %ld\n", p2 - p1);// 输出4(间隔4个元素)

五、多级指针

  • 二级指针:指向指针的指针。
int num = 10;
int *p = #//数据类型 *指针变量名;
int **pp = &p;// pp指向p的地址
printf("%d\n", **pp);// 通过二级指针访问num的值 → 输出10

1. 遍历二维数组(数组指针)

#include <stdio.h>int main() {int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};int (*p)[3] = matrix;// 指向第一行的地址for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("%d ", p[i][j]);// 等价于 *(*(p + i) + j)}printf("\n");}return 0;
}

六、指针&数组&字符串

1. 数组名的本质

数组名是数组首元素的地址常量(不可修改)。

int arr[3] = {10, 20, 30};
int *p = arr;// p指向arr[0]
printf("%d\n", *(p + 1));// 右移一个int单位 → 输出20

2. 指针遍历数组

for (int *ptr = arr; ptr < arr + 3; ptr++) {printf("%d ", *ptr);// 输出10 20 30
}

3. 遍历字符串

char *p = "Hello";
while (*p != '\0') {printf("%c ", *p);// 输出 H e l l op++;
}

4. 字符串拼接(动态分配)

#include <stdlib.h>
#include <string.h>
char *concat(const char *s1, const char *s2) {char *result = malloc(strlen(s1) + strlen(s2) + 1);// +1 为 '\0'strcpy(result, s1);strcat(result, s2);return result;
}// 使用示例
char *str = concat("Hello, ", "world!");
printf("%s\n", str);// 输出 Hello, world!
free(str);// 必须释放内存

5. 字符串数组(指针数组)

char *fruits[] = {"Apple", "Banana", "Cherry"};// 指针数组
for (int i = 0; i < 3; i++) {printf("%s\n", fruits[i]);// 输出各水果名称
}
printf("%s\n",*(fruits + 1));//输出Banana,数组的第二个元素
printf("%c\n",*(*(fruits + 1) + 1));//输出a,Banana的第二个字符

七、指针与函数

1. 传递指针到函数

// 修改外部变量值
void increment(int *x) {(*x)++;
}int main() {int a = 5;increment(&a);// a变为6return 0;
}

2. 返回指针的函数(指针函数)

/* 返回数组最大元素的地址,只能返回静态变量的地址、动态开辟(malloc)的地址,全局变量
的地址等,不能返回局部变量的地址(否则程序会崩溃)
*/
int* find_max(int *arr, int size) {int *max = arr;for (int *p = arr; p < arr + size; p++) {if (*p > *max) max = p;}return max;
}
int* find_max(int *arr, int size) {static int max = *arr;for (int *p = arr; p < arr + size; p++) {if (*p > max) max = *p;}return &max; 
}

3. 函数指针

指向函数的指针,用于回调机制:

int add(int a, int b) { return a + b; }
int (*func_p)(int, int) = add;// 声明函数指针
printf("%d\n", func_p(3, 4));// 输出7

八、void * 指针

  • 通用指针,可指向任意类型数据。
  • 使用前需强制类型转换。
void *ptr;
int x = 10;
ptr = (void *)&x;// 合法
printf("%d\n", *(int *)ptr);// 需转换为int*

九、

核心规则:const 的位置决定保护的对象

const 在 * 的左边,保护的是指针所指向的数据*p 不可变)。

const 在 * 的右边,保护的是指针本身p 不可变)。


1. 指向常量的指针(Pointer to Constant)

格式: const 类型 *ptr 或 类型 const *ptr

含义: 指针 ptr 可以指向不同的地址,但不能通过 ptr 来修改它所指向的数据。

示例:

int a = 10, b = 20;// 指向常量的指针
const int *ptr1 = &a;// ptr1 指向一个const int
int const *ptr2 = &a;// 等价写法
// *ptr1 = 15;  // 错误!不能通过ptr1修改数据
a = 15;// 合法,a本身不是constptr1 = &b;// 合法,ptr1可以指向其他地址
// *ptr1 = 25;  // 错误!仍然不能通过ptr1修改数据

2. 指针常量(Constant Pointer)

格式: 类型 * const ptr

含义: 指针 ptr 自身是常量,一旦初始化就不能再指向其他地址,但可以通过 ptr 修改它所指向的数据。

示例:

int x = 10, y = 20;// 指针常量
int * const ptr = &x;// ptr是常量指针
*ptr = 15;// 合法,可以修改指向的数据
// ptr = &y;    // 错误!ptr本身是常量,不能改变指向

3. 指向常量的指针常量(Constant Pointer to Constant)

格式: const 类型 * const ptr

含义: 既不能修改指针 ptr 的指向,也不能通过 ptr 修改所指向的数据。

示例:

const int z = 30;
int w = 40;// 指向常量的指针常量
const int * const ptr = &z;// *ptr = 35;    // 错误!不能修改数据
// ptr = &w;     // 错误!不能修改指针指向
int read = *ptr;// 合法,只能读取

总结表格(带变量名)

声明格式 指针(ptr)是否可修改 数据(*ptr)是否可修改 说明
int *ptr 普通指针
const int *ptr 指向常量的指针
int * const ptr 指针常量
const int * const ptr 指向常量的指针常量

十、野指针

1. 野指针

野指针是指指向无效内存地址的指针。这些指针通常指向已经被释放或未分配的内存区域。对野指针进行操作会导致未定义行为


2.主要成因

成因一:指针未初始化

int *ptr;// 未初始化,值是随机的垃圾值
*ptr = 10;// 危险!向随机内存地址写入数据
printf("%d", *ptr);// 可能导致程序崩溃

成因二:malloc后未检查或释放后继续使用

int *ptr = (int*)malloc(sizeof(int));
if (ptr != NULL) {*ptr = 100;
}
free(ptr);// 释放内存
// ptr现在成为野指针*ptr = 200;// 危险!访问已释放的内存
printf("%d", *ptr);// 未定义行为

成因三:指向局部变量(函数返回后)

int* createWildPointer() 
{int local = 42;return &local;// 返回局部变量的地址
}int main() {int *ptr = createWildPointer();// ptr是野指针printf("%d", *ptr);// 危险!local已销毁return 0;
}

成因四:指针越界访问

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;for (int i = 0; i < 10; i++) 
{// 越界访问printf("%d ", *(ptr + i));// 后5次是野指针访问
}

成因五:指针运算错误

int *ptr = (int*)malloc(5 * sizeof(int));
// ... 使用ptr
free(ptr);int *ptr2 = ptr + 2;// ptr2也是野指针

3. 野指针的危害

  1. 程序崩溃:段错误(Segmentation Fault)
  2. 数据损坏:意外修改其他有效数据
  3. 安全漏洞:可能被利用进行攻击
  4. 难以调试:错误表现随机,难以追踪

4. 避免野指针的方法

方法一:总是初始化指针

int *ptr = NULL;// 初始化为NULL
int *ptr2 = (int*)malloc(sizeof(int));// 或初始化为有效地址
if (ptr2 != NULL) {*ptr2 = 10;
}

方法二:释放后立即置NULL

int *ptr = (int*)malloc(sizeof(int));
if (ptr != NULL) {*ptr = 100;printf("%d\n", *ptr);
}free(ptr);// 释放内存
ptr = NULL;// 立即置NULL
// 安全检查
if (ptr != NULL) 
{printf("%d\n", *ptr);// 不会执行} 
else 
{printf("指针已释放\n");
}

方法三:避免返回局部变量地址

// 错误做法
int* badFunction() {int local = 5;return &local;
}// 正确做法1:使用静态变量
int* goodFunction1() {static int staticVar = 5;// 静态变量生命周期延长return &staticVar;
}// 正确做法2:使用动态内存
int* goodFunction2() {int *dynamicVar = (int*)malloc(sizeof(int));if (dynamicVar != NULL) {*dynamicVar = 5;}return dynamicVar;
}// 正确做法3:通过参数返回
void goodFunction3(int **result) {*result = (int*)malloc(sizeof(int));if (*result != NULL) {**result = 5;}
}

方法四:使用函数返回值检查

int *createArray(int size) {if (size <= 0) {return NULL;// 返回NULL而不是野指针}return (int*)malloc(size * sizeof(int));
}int main() {int *arr = createArray(5);if (arr == NULL) {printf("内存分配失败\n");return 1;}// 使用arr...free(arr);arr = NULL;return 0;
}

方法五:封装内存管理函数

// 安全的malloc封装
void* safeMalloc(size_t size) {void *ptr = malloc(size);if (ptr == NULL) {fprintf(stderr, "内存分配失败\n");exit(EXIT_FAILURE);}return ptr;
}// 安全的free封装
void safeFree(void **ptr) {if (ptr != NULL && *ptr != NULL) {free(*ptr);*ptr = NULL;// 自动置NULL}
}int main() {int *arr = (int*)safeMalloc(5 * sizeof(int));// 使用arr...safeFree((void**)&arr);// 自动置NULL// 现在arr为NULL,不会成为野指针return 0;
}

5. 检测野指针的工具

使用Valgrind(Linux)

gcc -g program.c -o program
valgrind --leak-check=full ./program

十一、动态内存分配

使用指针管理堆内存(需引入 <stdlib.h>):

int *arr = (int *)malloc(5 * sizeof(int));// 分配5个int的空间
if (arr != NULL) {arr[0] = 100;
// 使用完毕后释放内存free(arr);arr = NULL;// 避免野指针
}

十二、指针的注意事项&应用场合

问题 说明 规避方法
野指针 指向未知内存的指针 初始化时置空,释放后置空
空指针解引用 对 NULL 指针进行操作导致崩溃 使用前检查指针是否为 NULL
内存泄漏 未释放动态分配的内存 确保每个 malloc 对应一个 free
指针类型不匹配 操作不同类型指针导致数据错误 避免强制类型转换的误用
  1. 当函数需要传递一个数组时,指针代替数组
  2. 当函数需要返回一个地址(例如函数需要返回数组)的时候,需要使用指针
    实现。
  3. 当函数需要改变实参的时候,需要使用指针实现。-----形参改变实参

十三、代码示例

1. 指针操作基本流程

#include <stdio.h>
int main() {int a = 10;int *p = &a;printf("a的地址 = %p\n", (void *)p);// 输出地址(如0x7ffd...)printf("a的值 = %d\n", *p);// 输出10*p = 20;printf("修改后a的值 = %d\n", a);// 输出20return 0;
}

2. 动态数组操作

#include <stdio.h>
#include <stdlib.h>
int main() {int size = 5;int *arr = (int *)malloc(size * sizeof(int));if (arr == NULL) {printf("内存分配失败!\n");return 1;}for (int i = 0; i < size; i++) {arr[i] = i * 10;}for (int *p = arr; p < arr + size; p++) {printf("%d ", *p);// 输出0 10 20 30 40}free(arr);arr = NULL;return 0;
}

相关文章:

解码C语言指针

一、指针的定义与本质 1. 指针是什么? 指针是一种 存储变量内存地址 的特殊变量。所有数据存储在内存中,每个内存单元都有唯一地址(编号),指针通过记录地址实现对数据的间接访问。 2. 指针的核心作用直接操作内存:动态内存分配、硬件编程等。 提高效率:传递大对象时避免…...

windows下Qt调用fftw库

环境:Windows 11 Qt:6.8.3 程序中需要用到fftw库来进行傅里叶变换,通过网上的资料,配置了很久一直没成功,后来发下还是没有配置正确,最后终于成功,顺便记录一下 1.下载fftw3.3.5 http://www.fftw.org/install/windows.html,根据自已编译器版本下载32位或64位,我的Qt …...

AT_agc056_c [AGC056C] 01 Balanced

不难设 \(d_i\) 为前缀 \(i\) 中 \(0/1\) 数量的差值,显然有两个限制:\(d_{l - 1} = d_r\) \(|d_{i - 1} - d_i| \le 1\)可以差分约束,事实上,直接跑差分约束就可以得到字典序最小的构造了,这也算本题的价值之一。...

模拟费用流(s ver.)

1或许会在我彻底学会模拟费用流后同步发表于洛谷,希望退役前能等到彻底学会的那一天。推荐阅读:网络流——Alex_Wei 模拟费用流一般通过题目性质来快速找到增广路,进而降低单次增广的时间复杂度,不太能降低增广轮数。 消圈定理:一轮增广结束后,若残量网络上无负环,则当前…...

自推流SRS6.0配置相关

前提条件: 开通 1935、1985、8080 、8000(UDP)、 1900 、 8443端口;后面2个是开通https必须配置的。mkdir -p /data/www (本人习惯) 下载最新版 srs: git clone -b develop https://gitee.com/ossrs/srs.gitcd /data/www/srs/trunk ./configure make至此,srs安装成功。…...

火山引擎多模态数据湖:基于 Daft 与 Lance,构筑 AI 时代数据湖新范式

在 AI 技术飞速发展的当下,数据作为 AI 的 “燃料”,其形态与处理方式正发生深刻变革。本篇文章来自火山引擎LAS团队琚克俭在“2025AICon 全球人工智能开发与应用大会”分享,主要围绕 “AI 场景下多模态数据处理” 主题,介绍LAS团队基于 Daft+ Lance打造的多模态数据湖方案…...

doris窗口函数 LAG()(取上一条)和 LEAD()(取下一条)函数

在 Apache Doris 中,若需实现 “相邻数据间取上一条 / 下一条数据的字段值”,核心是利用 窗口函数(Window Function) 中的 LAG()(取上一条)和 LEAD()(取下一条)函数。这两个函数专门用于在有序的数据集内,获取当前行相邻行的指定字段值,无需手动关联表,效率更高。场…...

debmirror工具

安装mtli:~# apt install -y debmirror 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同时安装下列软件: ed liblockfile-simple-perl liblog-agent-perl 下列【新】软件包将被安装: debmirror ed liblockfile-simple-perl liblog-a…...

centos7卸载openjdk-java11

[root@localhost ~]# rpm -qa|grep -i openjdk java-11-openjdk-headless-11.0.23.0.9-2.el7_9.x86_64 java-11-openjdk-devel-11.0.23.0.9-2.el7_9.x86_64 java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64# 卸载命令, yum remove 会同时卸下该包及其不再被其它已安装包依赖的包。…...

jenkins的安装和配置

windows 安装 jenkins 自动化构建部署至linux服务器上 一、环境准备1、git安装环境 参考链接 https://www.cnblogs.com/yuarvin/p/12500038.html 2、maven安装环境,包括jdk环境安装 参考链接 https://www.cnblogs.com/yuarvin/p/7837963.html 3、Jenkins 安装环境 参考链接 ht…...

深入解析:【Day 52 】Linux-Jenkins

深入解析:【Day 52 】Linux-Jenkinspre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

本土开发者如何选择代码管理工具?Gitee与GitHub深度对比解析

本土开发者如何选择代码管理工具?Gitee与GitHub深度对比解析 在数字化转型浪潮下,代码管理工具已成为开发者日常工作的必备基础设施。面对国内外众多选择,新手开发者往往陷入选择困难。本文将从本土化开发视角,深入剖析主流代码管理工具的差异化优势,为开发者提供科学的选…...

MES系统核心组件

核心总览 在半导体工厂中,MES(Manufacturing Execution System,制造执行系统) 是最高层的指挥中枢,它负责管理生产线上从投料开始到成品产出的全部作业流程。而其他各种“XX Server”则是MES这个大脑指挥下的专业功能模块,负责处理特定类型的任务和数据。 各服务器功能详…...

易基因:多组学整合分析揭示DNA甲基化与基因组改变在肿瘤进化中的协同驱动机制|Nat Genet/IF29重磅

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,伦敦大学学院癌症研究所Nnennaya Kanu和弗朗西斯克里克研究所Peter Van Loo团队合作在国际遗传学Top期刊《自然遗传学》(Nature Genetics)发表题为“DNA methylation cooperates with genomic alterat…...

AI 视频模型大比拼(2025年7月版):价格、效果与分辨率

AI 视频模型大比拼(2025年7月版):价格、效果与分辨率pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

为什么芯片行业需要私有化部署软件?

在芯片研发过程中,每天产生的大量设计数据、测试结果和知识产权,构成了企业的核心竞争优势。一旦这些数据泄露,不仅可能导致数百万美元的研发投入付诸东流,更可能让企业在全球竞争中失去领先地位。 近年来,芯片行业面临的数据安全挑战日益严峻。根据行业报告,2024年芯片设…...

C++ std::string

C++ 标准库中的 std::string 是处理字符串的核心类,封装了字符串的存储、管理和操作,相比 C 风格的 char* 更安全、易用。 1、基本概念 1.1 基本特性 std::string 定义在 <string> 头文件中(属于 std 命名空间),本质是对动态字符数组的封装动态大小:自动扩容,无需…...

MathType数学公式编辑器v7.9.1

MathType全球最受欢迎的专业数学公式编辑器工具软件,可视化公式编辑器轻松创建数学方程式和化学公式。兼容Office Word、PowerPoint、Pages、Keynote、Numbers 等700多种办公软件,用于编辑数学试卷、书籍、报刊、论文、幻灯演示等文档轻松编写各种复杂的物理公式、化学方程式…...

git常见冲突场景及解决办法 - 指南

git常见冲突场景及解决办法 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

有关字节的基础知识

什么是字节位(bit):是计算机 内部数据 存储的最小单位,11001100是一个八位二进制数。字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写B来表示。字符:是指计算机中使用的字母、数字、字和符号 1bit表示一位 1Byte表示一个字节 1B=8b 1024B=1KB 1024KB=1M 102…...

strip去符号前后对比

strip去符号前后对比 strip 是 binutils 中用于给二进制文件(可执行程序、静态库、动态库)去符号信息的工具。它只修改符号表,不碰指令内容,因此去除符号后的二进制文件中,各部分指令和原来是完全一一对应的,各section大小和偏移也不变,各符号的偏移也不变,只是原本的指…...

2025 ICPC网络赛第一场 L cover

给一个长度为 \(n\) 的序列 \(\{a_n\}\) 和 \(m\) 个操作,其中第 \(i\) 个操作是把区间 \([l_i,r_i]\) 都赋值为 \(c_i\)。 现在按顺序遍历每个操作,每个操作可执行可不执行。 最大化序列的颜色段数,即 \(1+\sum\limits_{i=2}^n[a_{i-1}\not=a_i]\)。 \(1\leq a_i,c_i\leq n…...

文件自动同步软件用哪个好,高效选择指南

内容概要 在数字化办公日益普及的今天,文件自动同步软件已成为提升团队协作效率的重要工具。面对市场上琳琅满目的选择,“文件自动同步软件用哪个好”成为了许多企业IT管理者和个人用户共同关注的问题。本指南将深入剖析各类文件自动同步软件的核心优势,特别推荐如Ftrans FT…...

【初赛】指针 - Slayer

指针的性质是理解其行为和使用方式的核心,主要包括以下几个方面: 1. 指针是存储地址的变量 指针的本质是一个变量,但其存储的不是数据本身,而是另一个变量(或内存单元)的内存地址。例如:int a = 10; int* p = &a; 中,p 存储的是 a 的内存地址(如 0x7ffd6b6a45c4)…...

国产化FPGA-2050-基于JFMK50T4(XC7A50T)的核心板

基于JFMK50T4(XC7A50T)的核心板(IEB-PS-3051-邮票孔) 一、核心板概述板卡基于JFMK50T4国产化FPGA芯片,设计的一款工业级核心板,板卡集成主芯片、电源、DDR、配置芯片,大大减轻客户的扩展开发困难。丰富的IO和4个GTP,让用户轻易设计PCIe的数据卡,AD卡,结合本公司国产…...

hbase学习2

一、表管理操作创建表 hbase create 表名, 列族1, 列族2, ...示例:创建student表,有info和score两个列族 create student, info, score 2. 查看所有表 hbase list 3. 查看表描述 hbase describe 表名 describe student 4. 检查表是否存在 hbase exists 表名 5. 禁用/启用表 h…...

基于Python+Vue开发的健身房管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的健身房管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的健身房管理系统项目,大学生可以在实践中学习和提升…...

2025年纷享销客生态伙伴大会无锡站圆满举办!

近日,2025年纷享销客生态伙伴大会(无锡站)成功举办。大会以“智享未来,领创 CRM 新纪元”为主题,吸引了众多生态伙伴齐聚一堂,共话 CRM 行业新趋势,共探 AI 赋能下的客户经营新范式。一、数智化浪潮下的CRM变革与机遇<纷享销客经营副总裁 张睿> 纷享销客经营副总…...

英语_阅读_digital technology_待读

These days, digital technology is everywhere in our lives.如今,数字科技无处不在地出现在我们的生活中。 From smartphones to tablets, we use digital devices every day at school, at home and when hanging out with friends.从智能手机到平板电脑,我们每天在学校、…...

达梦 两个bug json 导致数据库crash 和 优化器解析or 导致结果不一样

##sample1 无法解析 json 数据库直接crash. 分析函数,定位到BUG 升级数据库软件,问题得到规避 ########sample 2 优化器解析or 导致结果不一样--测试1 原有的查询顺序,查到空行。 SQL> SELECT coltablename,DONO,colupdateable,colupdateableFROM SEBMDEV.DATAOBJECT…...

MySQL迁移至GreatSQL后,timestamp字段插入报错解析

MySQL迁移至GreatSQL后,timestamp字段插入报错解析 背景描述 某业务系统进行国产化适配,将MySQL的数据迁移到 GreatSQL 后,执行 INSERT INTO ,update_time传参为空时报错,报错信息为:ERROR 1048 (23000): Column update_time cannot be null ,而原来旧的MySQL环境中没有这…...

2025年文件摆渡系统哪个品牌好推荐

内容概要 在寻找文件摆渡系统的过程中,企业往往关心哪个品牌能够更好地满足其安全、高效的数据交换需求。2025年,市场上涌现出众多品牌,但“文件摆渡系统哪个品牌好”这一问题,不少企业给出了共同的答案——Ftrans Ferry跨网文件安全交换系统。该系统凭借其全面的安全防护、…...

VU9P板卡设计方案:565-基于VU9P的32@ SFP28+4@ QSFP28路光纤交换板卡

、板卡概述 板卡基于Xilinx FPGA VU9P 设计的一款32路SFP28+4路QSFP28的光纤交换板卡,用于以太网的交换功能的验证。 二、板卡原理框图三、板卡主要性能 ● 主芯片:选用 XCVU9P-2FLGB2104I(702, 76)47.5*47.5 ● 32路SFP28,支持1G、10G以太网协议; 1G,10G 自动适配。 ●…...

Python中使用列表、map和filter函数配合lambda表达式来操作集合

在 Python 中,map()、filter() 和 lambda 表达式是处理集合(如列表)的常用工具,可以快速实现 转换 和 过滤 操作。以下是具体示例:1. map() 函数:对列表元素进行转换 作用: 对列表的每个元素应用一个函数,返回转换后的元素组成的迭代器。 语法: map(function, iterabl…...

大模型decoder中权重矩阵的理解 - 实践

大模型decoder中权重矩阵的理解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

文件安全外发平台用哪个,最佳选择是什么?

内容概要 在探讨文件安全外发平台用哪个这一话题时,我们首先要对文件安全外发平台有一个全面的了解。这类平台主要用于确保企业文件在外部传输过程中的安全性,防止数据泄露。市面上存在多种文件安全外发平台,它们各有千秋。而要说到安全管控强大且稳定传输大文件的平台,“F…...

【初赛】数 - Slayer

0x3f3f3f3f = 1061109567 0x7f7f7f7f = 2139062143 0x7fffffff = 2147483647 0xffffffff = 4294967295 0x1fffffff = 536870911 0x1f1f1f1f = 522133279...

http连接(webFlux vs tomcat)

HTTP连接的最大数量不是一个固定的值,它取决于一个由硬件资源、操作系统配置、网络栈、以及应用程序本身共同构成的复杂系统。 简单来说:在一台配置良好的现代服务器上,使用异步非阻塞模型(如WebFlux),支持超过100万甚至更多的并发HTTP连接在理论上是可行的。 而对于传统…...

英语_阅读_Generative AI_待读

Artificial Intelligence (AI) has become part of our everyday life.人工智能(AI)已经成为我们日常生活的一部分。 It makes our smart devices smarter.它让我们的智能设备变得更聪明。 You might have already used some AI programs at school.你可能已经在学校使用过一…...

P8500 [NOI2022] 冒泡排序 题解

Description 最近,小 Z 对冒泡排序产生了浓厚的兴趣。 下面是冒泡排序的伪代码: 输入: 一个长度为 n 的序列 a[1...n] 输出: a 从小到大排序后的结果 for i = 1 to n do:for j = 1 to n - 1 doif (a[j] > a[j + 1])交换 a[j] 与 a[j + 1] 的值冒泡排序的交换次数被定义为在…...

【初赛】链表 - Slayer

链表性质知识点总结 链表是一种线性数据结构,其核心特点是数据元素(称为 “节点”)通过指针或引用连接,而非像数组那样存储在连续的内存空间中。这种结构决定了它与数组截然不同的性质,适用于频繁插入 / 删除、内存动态分配的场景。 一、链表的核心定义与结构基本构成链表…...

纷享销客CRM系统自定义APL代码破解企业深度定制难题

在许多中大型企业,尤其是央企、金融、高科技等行业,对 CRM 系统提出了更为复杂的业务流程定制需求。尽管零代码、低代码配置工具有一定的灵活性,但在面对高度复杂、深度融合业务逻辑的安全机制或特殊流程时,仍显乏力。 为此,纷享销客提供了服务端代码级定制能力,通过自定…...

第2章 zynq开发板FSBL的生成和NAND烧录

前言 由于本人较懒,记录主要是过程,由于zynq的比stm32做的人少很多,资料也少很多,我会简要介绍原理,操作流程主要由图片加少量文字组成,每一章都是在之前的章节基础上做的一、新建FSBL工程 打开vivado,打开SDK打开后会自动根据之前生成的HDF自动生成硬件平台新建一个FSB…...

工具大全

<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><title>工具大全</title><style>/*全…...

RocketMQ vs kafka

目录背景和价值1. 更激进的“零拷贝”技术2. 更简洁的存储模型3. 更“粗糙”但高效的批处理4. 权衡取舍的可靠性保证对比总结参考资料 背景和价值 你这个问题非常好,直击了两者设计哲学的核心差异。 简单来说,Kafka 更快,并非因为它的代码效率绝对更高,而是因为它的设计目标…...

JL-32 土壤速测仪 手持便携 大容量 多参数可同时监测

JL-32 土壤速测仪 手持便携 大容量 多参数可同时监测产品概述 土壤速测仪是一款携带方便,操作简单,集采集与存储于一体的可移动式观测仪器。由手持式速测主机、土壤类传感器、USB数据线、电源适配器、便携式手提箱等部分组成。速测仪主机可通过集线器接入不同类型的传感器,互…...

直播录制神器!一款多平台直播流自动录制客户端!

StreamCap —— 一个基于 FFmpeg 和 StreamGet 的多平台直播流录制客户端,覆盖 40+ 国内外主流直播平台,支持批量录制、循环监控、定时监控和自动转码等功能。大家好,我是 Java陈序员。 现如今,观看直播已成为日常生活中的一种娱乐消遣方式,但常常由于一些不可抗的原因错过…...

101.计组--二章

101.计组--二章数据的表示和运算 "自六月份另一个学校毕业 已经有拖三个多月的计组学习 当时其实已经已有一些学习 仅仅差了一节内容结束 也确实因为这个复杂的运算各类东西 言归正传 新的学校 新的学习 开始总结"先看一下总的还是分为三大块 三步走 一.数制 编码 先…...

LobeChat搭建

步骤 docker search lobe-chat docker pull lobehub/lobe-chat docker run -d -p 3210:3210 -e ACCESS_CODE=lobe66 --name lobe-chat lobehub/lobe-chat docker ps访问 http://localhost:3210 相关的key进入网页再配置,不必加入到docker run中。本文来自博客园,作者:潇汀…...

长园智能装备遇上利驰SuperHarness-3D,实现充电桩线束设计效率与精度双提升!

利驰数字线束软件,赋能长园智能装备充电桩线束智造。设计案例:​感谢南瑞、盛弘、长园等众多充电桩龙头企业,选择利驰数字线束[抱拳][抱拳][抱拳]...