[C]基础13.深入理解指针(5)
- 博客主页:向不悔
- 本篇专栏:[C]
- 您的支持,是我的创作动力。
文章目录
- 0、总结
- 1、sizeof和strlen的对比
- 1.1 sizeof
- 1.2 strlen
- 1.3 sizeof和strlen的对比
- 2、数组和指针笔试题解析
- 2.1 一维数组
- 2.2 字符数组
- 2.2.1 代码1
- 2.2.2 代码2
- 2.2.3 代码3
- 2.2.4 代码4
- 2.2.5 代码5
- 2.2.6 代码6
- 2.3 二维数组
- 3、指针运算笔试题解析
- 3.1 题目1
- 3.2 题目2
- 3.3 题目3
- 3.4 题目4
- 3.5 题目5
- 3.6 题目6
- 3.7 题目7
0、总结
1、sizeof和strlen的对比
1.1 sizeof
sizeof
计算变量所占内存内存空间大小的,单位是字节。如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。sizeof
只关注占用内存空间的大小,不在乎内存中存放什么数据。如下:
#include <stdio.h>
int main()
{int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(int));return 0;
}
1.2 strlen
strlen是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen(const char* str);
统计的是从strlen
函数的参数str
中这个地址开始向后,\0
之前字符串中字符的个数。
strlen
函数会一直向后找\0
字符,直到找到为止,所以可能存在越界查找。
#include <stdio.h>
int main()
{char arr1[3] = { 'a','b','c' };char arr2[] = "abc";printf("%d\n", strlen(arr1)); // unknownprintf("%d\n", strlen(arr2)); // 3printf("%d\n", sizeof(arr1)); // 3printf("%d\n", sizeof(arr2)); // 4return 0;
}
运行:
15
3
3
4
1.3 sizeof和strlen的对比
sizeof | strlen |
---|---|
1、sizeof 是操作符。2、 sizeof 计算操作数所占内存的大小,单位是字节。3、不关注内存中存放什么数据。 | 1、strlen 是库函数,使用需要包含头文件string.h 2、 strlen 是求字符串长度的,统计的是\0 之前字符的隔个数。3、关注内存中是否有 \0 ,如果没有\0 ,就会持续往后找,可能会越界。 |
2、数组和指针笔试题解析
2.1 一维数组
做题之前,先理解概念:
- 1、 数组名的理解:数组名是数组首元素(第一个元素的地址)
- 2、 但有两个例外:
- sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小,单位是字节。
- &数组名 - 数组名表示整个数组,取出的是整个数组的地址。
- 3、 除此之外,所有的数组名是数组首元素的地址。
#include <stdio.h>int main()
{int a[] = { 1,2,3,4 };printf("01:%zd\n", sizeof(a)); printf("02:%zd\n", sizeof(a + 0)); printf("03:%zd\n", sizeof(*a)); printf("04:%zd\n", sizeof(a + 1)); printf("05:%zd\n", sizeof(a[1])); printf("06:%zd\n", sizeof(&a)); printf("07:%zd\n", sizeof(*&a)); printf("08:%zd\n", sizeof(&a + 1)); printf("09:%zd\n", sizeof(&a[0])); printf("10:%zd\n", sizeof(&a[0] + 1)); return 0;
}
运行(32位环境):
01:16
02:4
03:4
04:4
05:4
06:4
07:16
08:4
09:4
10:4
运行(64位环境):
01:16
02:8
03:4
04:8
05:4
06:8
07:16
08:8
09:8
10:8
解析:
解析:
//01 : 16 because:sizeof(数组名)->求数组的大小。
//02 : 4/8 because:不是单独数组名,所以a是首元素的地址,类型为int*,a+0还是首元素地址。
//03 : 4 because:*a == *(a + 0) == a[0],a是首元素的地址,*a就是首元素。
//04 : 4/8 because:a是首元素的地址,a+1跳过1个整型,a+1就是第二个元素的地址。
//05 : 4 because:a[1]就是第二个元素。
//06 : 4/8 because:&a是数组的地址,所以是4/8。再次总结,sizeof(数组名)是数组的大小,sizeof(&数组名)是数组的地址。
//07 : 16 because:*&相互抵消,所以等价于sizeof(a)。
//08 : 4/8 because:&a+1是跳过整个数组后的那个位置的地址。
//09 : 4/8 because:首元素的地址。
//10 : 4/8 because:数组第二个元素的地址。
2.2 字符数组
2.2.1 代码1
#include <stdio.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("01:%zd\n", sizeof(arr));printf("02:%zd\n", sizeof(arr + 0));printf("03:%zd\n", sizeof(*arr));printf("04:%zd\n", sizeof(arr[1]));printf("05:%zd\n", sizeof(&arr));printf("06:%zd\n", sizeof(&arr + 1));printf("07:%zd\n", sizeof(&arr[0] + 1));return 0;
}
运行(32位):
01:6
02:4
03:1
04:1
05:4
06:4
07:4
运行(64位):
01:6
02:8
03:1
04:1
05:8
06:8
07:8
解析:
解析:
//01:6 because:数组名单独放在sizeof内部,计算的是数组的大小。
//02:4/8 because:arr是数组名表示首元素的地址,arr+0还是首元素的地址。
//03:1 because:arr是首元素的地址,*arr就是首元素。
//04:1 because:arr[1]就是第二个元素。
//05:4/8 because:&arr是数组地址。
//06:4/8 because:跳过整个数组,指向了数组后边的空间。
//07:4/8 because:第二个元素的地址。
2.2.2 代码2
#include <stdio.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("01:%zd\n", strlen(arr));printf("02:%zd\n", strlen(arr + 0));//printf("03:%zd\n", strlen(*arr));//printf("04:%zd\n", strlen(arr[1]));printf("05:%zd\n", strlen(&arr));printf("06:%zd\n", strlen(&arr + 1));printf("07:%zd\n", strlen(&arr[0] + 1));return 0;
}
运行:
01:42
02:42
05:42
06:36
07:41
解析:
解析:
//01:unknown because:arr 是首元素的地址,数组中没有\0,结果随机。
//02:unknown because:arr+0 是首元素的地址,数组中没有\0,结果随机。
//03:err because:arr是首元素的地址,*arr是首元素,就是'a','a'的ascii码值是97
// 相当于把97作为地址传递给了strlen,strlen得到的就是野指针,代码有问题。
//04:err because:arr[1]->'b'->98,传递给strlen也是错误的。
//05:unknown because:&arr是数组的地址,起始位置是数组的第一个元素的位置,结果随机。
//06:unknown because:随机值 x-6
//07:unknown because:随机值 x-1
2.2.3 代码3
#include <stdio.h>int main()
{char arr[] = "abcdef";printf("01:%zd\n", sizeof(arr));printf("02:%zd\n", sizeof(arr + 0));printf("03:%zd\n", sizeof(*arr));printf("04:%zd\n", sizeof(arr[1]));printf("05:%zd\n", sizeof(&arr));printf("06:%zd\n", sizeof(&arr + 1));printf("07:%zd\n", sizeof(&arr[0] + 1));return 0;
}
运行(32位):
01:7
02:4
03:1
04:1
05:4
06:4
07:4
运行(64位):
01:7
02:8
03:1
04:1
05:8
06:8
07:8
解析:
解析:
//01:7 because:数组总大小,7个字节。
//02:4/8 because:首元素地址。
//03:1 because:首元素。
//04:1 because:第二个元素。
//05:4/8 because:数组地址。
//06:4/8 because:跳过整个数组的地址。
//07:4/8 because:第二个元素的地址。
2.2.4 代码4
#include <stdio.h>int main()
{char arr[] = "abcdef";printf("01:%zd\n", strlen(arr));printf("02:%zd\n", strlen(arr + 0));//printf("03:%zd\n", strlen(*arr));//printf("04:%zd\n", strlen(arr[1]));printf("05:%zd\n", strlen(&arr));printf("06:%zd\n", strlen(&arr + 1));printf("07:%zd\n", strlen(&arr[0] + 1));return 0;
}
运行:
01:6
02:6
05:6
06:26
07:5
解析:
解析:
//01:6 because:6
//02:6 because:arr首元素的地址,arr+0还是首元素的地址。
//03:err because:'a' ->97,err
//04:err because:'b' ->98,err
//05:6 because:数组地址。
//06:unknown because:跳过整个数组的地址。
//07:5 because:5
2.2.5 代码5
#include <stdio.h>int main()
{char* p = "abcdef";printf("01:%zd\n", sizeof(p));printf("02:%zd\n", sizeof(p + 1));printf("03:%zd\n", sizeof(*p));printf("04:%zd\n", sizeof(p[0]));printf("05:%zd\n", sizeof(&p));printf("06:%zd\n", sizeof(&p + 1));printf("07:%zd\n", sizeof(&p[0] + 1));return 0;
}
运行(32位):
01:4
02:4
03:1
04:1
05:4
06:4
07:4
运行(64位):
01:8
02:8
03:1
04:1
05:8
06:8
07:8
解析:
解析:
//01:4/8 because:p是指针变量,计算指针变量的大小。
//02:4/8 because:b的地址。
//03:1 because:*p是char类型,1个字节。
//04:1 because:p[0] -> *(p+0) -> *p -> 'a' 大小1个字节。
//05:4/8 because:取出的是p的地址。
//06:4/8 because:跳过p指针变量后的地址。
//07:4/8 because:取出字符串首字符的地址,+1是第二个字符的地址。
2.2.6 代码6
#include <stdio.h>int main()
{char* p = "abcdef";printf("01:%zd\n", strlen(p));printf("02:%zd\n", strlen(p + 1));//printf("03:%zd\n", strlen(*p));//printf("04:%zd\n", strlen(p[0]));printf("05:%zd\n", strlen(&p));printf("06:%zd\n", strlen(&p + 1));printf("07:%zd\n", strlen(&p[0] + 1));return 0;
}
运行:
01:6
02:5
05:3
06:11
07:5
解析:
解析:
//01:6 because:传入首元素的地址。
//02:5 because:传入第二个元素的地址。
//03:err because:'a' -> 97,err
//04:err because:'a' -> 97,err
//05:unknown because:&p是指针变量p的地址,和字符串"abcdef"关系不大
// 从p这个指针变量的起始位置开始向后数的,p变量存放的地址是什么,不知道,因此随机值。
//06:unknown because:随机值
//07:5 because:第二个字符的地址。
2.3 二维数组
#include <stdio.h>int main()
{int a[3][4] = { 0 };printf("01:%zd\n", sizeof(a));printf("02:%zd\n", sizeof(a[0][0]));printf("03:%zd\n", sizeof(a[0]));printf("04:%zd\n", sizeof(a[0] + 1));printf("05:%zd\n", sizeof(*(a[0] + 1)));printf("06:%zd\n", sizeof(a + 1));printf("07:%zd\n", sizeof(*(a + 1)));printf("08:%zd\n", sizeof(&a[0] + 1));printf("09:%zd\n", sizeof(*(&a[0] + 1)));printf("10:%zd\n", sizeof(*a));printf("11:%zd\n", sizeof(a[3]));return 0;
}
运行(32位):
01:48
02:4
03:16
04:4
05:4
06:4
07:16
08:4
09:16
10:16
11:16
运行(64位):
01:48
02:4
03:16
04:8
05:4
06:8
07:16
08:8
09:16
10:16
11:16
解析:
解析:
//01:48 because:数组的大小,48 = 3*4*sizeof(int)
//02:4 because:第一行第一个元素。
//03:16 because:第一行的数组名,单独放在sizeof内部了。
//04:4/8 because:a[0]第一行的数组名,但是a[0]并没有单独放在sizeof内部,
// 所以这里的数组名a[0]是数组首元素的地址,+1就是a[0][1]的地址。
//05:4 because:第一行第二个元素。
//06:4/8 because:a作为数组名并没有单独放在sizeof内部,a表示数组首元素的地址,
// 是二维数组首元素的地址,也就是第一行的地址,a+1跳过一行,指向第二行。
//07:16 because:a+1是第二行的地址,*(a+1)就是第二行,计算的是第二行的大小。
// *(a+1) == a[1],a[1]是第二行数组名。
//08:4/8 because:a[0]是第一行的数组名,&a[0]取出的是数组的地址,&a[0]+1就是第二行的地址。
//09:16 because:对第二行的地址解引用。
//10:16 because:a作为数组名并没有单独放在sizeof内部,所以a表示数组首元素的地址,是
// 二维数组首元素的地址,也就是第一行的地址,*a就是第一行,计算的是第一行的大小。
// *a == *(a+0) == a[0]
//11:16 because:a[3]无需真实存在,可以通过类型推断算出长度。a[3]是第四行的数组名。
3、指针运算笔试题解析
3.1 题目1
#include <stdio.h>
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));return 0;
}
运行:
2,5
画图解析:
3.2 题目2
//在X86环境下
//假设结构体的大小是20个字节
//程序输出的结构是啥?
#include<stdio.h>
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}
运行:
00100014
00100001
00100004
解析:
1、struct Test* p = (struct Test*)0x100000; // 将指针p强制指向内存地址 0x100000
。
2、printf("%p\n", p + 0x1);
- 当对指针进行加法(如
p+0x1
)时,实际地址的偏移量 = 指针指向类型的大小 * 加数。 - p是
struct Test*
类型,0x100000 + 0x1 * 20 = 0x100000+0x14 = 0x100014
。
3、printf("%p\n", (unsigned long)p + 0x1);
- p被强制转化为
unsigned long
,此时是普通整数加法。
4、printf("%p\n", (unsigned int*)p + 0x1);
- p被强制转化为
unsigned int*
,指针运算的单位是unsigned int
的大小。
3.3 题目3
#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int* p; p = a[0];printf("%d", p[0]);return 0;
}
运行:
1
解析:
int* p = a[0]; // p 指向第一行首地址(即 &a[0][0])
printf("%d", p[0]); // 访问 p[0] = a[0][0]
3.4 题目4
//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
int main()
{int a[5][5];int(*p)[4];p = a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0;
}
运行:
FFFFFFFC,-4
解析:
a[4][2]
是第四行第2列的元素:
地址 = a基址 + 4行偏移 + 2列偏移 = a + (4×5 + 2)×4 = a + 88 字节
p[4][2]
是第4个int[4]
数组的第2个元素:
地址 = p基址 + 4个数组偏移 + 2列偏移 = a + (4×4 + 2)×4 = a + 72 字节
- 地址差
&p[4][2] - &a[4][2] = (a + 72) - (a + 88) = -16 字节
- 以
int
为单位的:
-16 字节 / sizeof(int) = -4
输出解释:
- 在%p格式中,
-4
的补码表示为0xFFFFFFFC
(32位系统)。
3.5 题目5
#include <stdio.h>
int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 = (int*)(&aa + 1);int* ptr2 = (int*)(*(aa + 1));printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}
运行:
10,5
3.6 题目6
#include <stdio.h>
int main()
{char* a[] = { "work","at","alibaba" };char** pa = a;pa++;printf("%s\n", *pa);return 0;
}
运行:
at
3.7 题目7
#include <stdio.h>
int main()
{char* c[] = { "ENTER","NEW","POINT","FIRST" };char** cp[] = { c + 3,c + 2,c + 1,c };char*** cpp = cp;printf("%s\n", **++cpp);printf("%s\n", *-- * ++cpp + 3);printf("%s\n", *cpp[-2] + 3);printf("%s\n", cpp[-1][-1] + 1);return 0;
}
运行:
POINT
ER
ST
EW
完。
相关文章:

[C]基础13.深入理解指针(5)
博客主页:向不悔本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …...

OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…...
11.原型模式:思考与解读
原文地址:原型模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在软件开发中,尤其是当需要创建大量相似对象时,你是否遇到过这样的情况:每次创建新对象时,是否都需要重新初始化一些复杂的…...
深度解析 Java 泛型通配符 `<? super T>` 和 `<? extends T>`
Java 泛型中的通配符 ? 与 super、extends 关键字组合形成的 <? super T> 和 <? extends T> 是泛型系统中最重要的概念之一,也是许多开发者感到困惑的地方。本文将全面剖析它们的语义、使用场景和设计原理。 一、基础概念回顾 1. 泛型通配符 ? ?…...

hbuilderx云打包生成的ipa文件如何上架
使用hbuilderx打包,会遇到一个问题。开发的ios应用,需要上架到app store,因此,就需要APP store的签名证书,并且还需要一个像xcode那样的工具来上架app store。 我们这篇文章说明下,如何在windows电脑&…...

Golang | 位运算
位运算比常规运算快,常用于搜索引擎的筛选功能。例如,数字除以二等价于向右移位,位移运算比除法快。...
天能资管(SkyAi):大数据洞察市场,引领投资新风向
在金融市场的浩瀚海洋中,信息如同灯塔,指引着投资者前行的方向。谁能更准确地把握市场动态和趋势,谁就能在激烈的市场竞争中占据先机。天能资管(SkyAi),作为卡塔尔投资局(QIA)旗下的科技先锋,凭借其强大的大数据处理能力与前沿的技术架构,为全球投资者提供了前所未有的市场洞察…...

产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号
单分子荧光成像技术,作为生物分子动态研究的关键工具,对捕捉微弱信号要求严苛。传统EMCCD相机因成本高昂,动态范围有限,满阱容量低等问题,制约单分子研究成果产出效率。 千眼狼精准把握科研需求与趋势,自研…...
基于大牛直播SDK的Android屏幕扬声器采集推送RTMP技术解析
在移动互联网时代,直播技术的应用越来越广泛,而屏幕采集推送作为直播内容源的重要获取方式之一,也备受关注。本文将基于大牛直播SDK,深入剖析如何实现Android屏幕采集推送RTMP的完整流程,带你领略其背后的技术细节与魅…...
Linux防火墙工具UFW介绍
UFW(Uncomplicated Firewall)是 Ubuntu、Debian 等 Debian 系 Linux 发行版默认的防火墙管理工具,基于 iptables 开发,旨在通过简化的命令行接口(CLI)降低防火墙配置门槛,适合新手和简单场景。 核心目标:让用户无需深入理解 iptables 的 “表 - 链” 结构,通过直观的命…...
k8s 手动续订证书
注意:如果是高可用环境,本文的操作需要在所有控制节点都执行。 查看证书是否过期 kubeadm certs check-expirationkubeadm certs renew可以续订任何特定证书,或者使用子命令all可以续订所有证书: kubeadm certs renew all使用 kubeadm 构建的集群通常会将admin.conf证书复…...
vc++ 如何调用poco库
1. 下载并安装 Poco 库 你可以从 Poco 的官方网站(POCO C Libraries - Simplify C Development )下载其源代码压缩包。下载完成后,按照下面的步骤进行编译和安装: 解压源代码:把下载的压缩包解压到指定目录。配置编译…...

Hot100方法及易错点总结2
本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多,必须多做几遍)138.随机链表的复制148.排序链表 N…...

网络:手写HTTP
目录 一、HTTP是应用层协议 二、HTTP服务器 三、HTTP服务 认识请求中的uri HTTP支持默认首页 响应 功能完善 套接字复用 一、HTTP是应用层协议 HTTP下层是TCP协议,站在TCP的角度看,要提供的服务是HTTP服务。 这是在原来实现网络版计算器时&am…...
C++[类和对象][3]
C[类和对象][3] 赋值运算符的重载(operator) 1.是一个默认成员函数,重载必须为成员函数,用于两个已经存在的对象,(d1d3赋值重载)(Stack d4d1拷贝构造(因为d4未存在,初始化)) 2.建议写成引用返回提高效率,可以连续赋值重载 3.没有写的时候会自动生成,完成值拷贝/浅拷贝对(对于…...

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南:从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…...

【python】如何将python程序封装为cpython的库
python程序在发布时,往往会打包为cpython的库,并且根据应用服务器的不同架构(x86/aarch64),以及python的不同版本,封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式: 首…...
【人工智能】DeepSeek 的开源生态:释放 AI 潜能的社区协同与技术突破
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek 作为中国 AI 领域的先锋,以其高效的混合专家模型(MoE)和彻底的开源策略,在全球 AI 社区掀起波澜。本文深入剖析 DeepSeek 的开…...
【差分隐私】假设检验的视角(高斯差分隐私)
在差分隐私中,假设检验的框架被用来量化攻击者通过机制输出区分两个相邻数据集 S S S 和 S ′ S S′ 的难度。这种区分的根本困难直接反映了隐私保护强度。以下是对问题的详细解释: 1. 假设检验的基本设定 原假设 H 0 H_0 H0:数据集为 …...

计算机组成原理 课后练习
例一: 例二: 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式:最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘,并通…...
pytorch手动调整学习率
文章目录 1. 为什么引入学习率衰减?2. 针对不同层设置不一样的学习率3. 手动更新学习率4. 使用学习率调度器5. 推荐做法 在前面的文章中,介绍了各种学习率。在此,将进行拓展,学习如何手动更新学习率(即不使用pytorch自…...

SVN仓库突然没有权限访问
如果svn仓库突然出现无法访问的情况,提示没有权限,所有账号都是如此,新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时,大概率库里面的文件有http或者https的字样,因为单独给该文件添加权限导致…...

【Qt】文件
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 Qt 文件概述 二:🔥 输入输出设备类 三:🔥 文件读写类 四:🔥 文件和目录信息类 五&…...
7.DJI-PSDK:psdk负载应用固件升级(基于RTOS)
DJI-PSDK:psdk负载应用固件升级(基于RTOS): 在单片机应用程序开发阶段,我们可以借助keil5和J-LINK来直接下载应用程序进行开发和调试, 但在产品交付之后,我们对应用程序做了改动和升级,是断然不可能采用这种方式的,我们应该将新版本的程序固件打包发给客户, 能够方便用…...
ArrayUtils:数组操作的“变形金刚“——让你的数组七十二变
各位数组操控师们好!今天给大家带来的是Apache Commons Lang3中的ArrayUtils工具类。这个工具就像数组界的"孙悟空",能让你的数组随心所欲地变大、变小、变长、变短,再也不用对着原生数组的"死板"叹气了! 一…...
架构-系统可靠性分析与设计
一、可靠性相关基本概念 1. 可靠性与可用性 可靠性:软件系统在遇到错误、意外操作或系统故障时,仍能维持自身功能特性的能力。 举例:手机银行APP在用户误操作(如快速点击多次转账)时,仍能正确处理交易并避…...

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南
一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务,专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据,为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…...
大模型备案对模型训练语料的要求
昨天接到一位客户的咨询,说他们的模型还在开发阶段,想提前了解一下大模型备案政策中对于模型训练语料有什么具体要求,提前规避一下。客户确实有前瞻性,考虑得比较充分。训练语料在研发阶段至关重要,直接影响模型的性能…...

dstream
DStream转换DStream 上的操作与 RDD 的类似,分为 Transformations(转换)和 Output Operations(输出)两种,此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform(…...
CentOS系统中MySQL安装步骤分享
在 CentOS 系统上安装 MySQL,需要依次进行环境检查、软件源配置、安装 MySQL、启动服务等操作。我将按照规范流程,为你详细分享完整且具体的安装步骤。 在 CentOS 系统中安装 MySQL 数据库,能够为各类应用提供高效稳定的数据存储和管理服务。…...