C语言进阶之笔试题详解(1)
引言:
对指针知识进行简单的回顾,然后再完成笔试题。
✨ 猪巴戒:个人主页✨
所属专栏:《C语言进阶》
🎈跟着猪巴戒,一起学习C语言🎈
目录
引言:
知识简单回顾
指针是什么
指针变量的大小?
指针类型的意义
指针的运算
指针数组
数组名是什么
数组指针
函数指针
函数指针数组
回调函数
笔试题
一维数组
题目:
解析:
总结:
字符数组
题目1:
解析:
题目2:
解析:
总结:
题目3:
解析:
总结:
题目4:
解析:
总结:
题目5:
答案:
题目6:
答案:
知识简单回顾
指针是什么
内存 ->内存的单元(1byte)->编号->地址
我们有一块很大的内存空间,内存空间被分为一个一个的单元,一个内存单元的大小是1byte(字节),每个字节都有它的编号,这个编号就是地址,地址又叫做指针。
指针就是一个地址。
我们口头语说的指针一般指:指针变量
指针变量就是一个变量,就是一块内存空间,指针变量用来存放地址。
&a就是内存的编号,也是地址.
这个指针变量叫做pa,int*是类型(整形指针),通过这个类型创造的变量叫做pa。*pa就是对pa进行解引用,通过pa存放的地址找到它所指向的对象(a),pa存的是a的地址所以pa指向a,*pa其实就是a。
*pa = 20;就相当于 a = 20;将 a 的值改变了。
int main()
{int a = 0;int* pa = &a;*pa = 20;return 0;
}
指针变量的大小?
——4/8个字节,取决于编译器是x86环境还是x64环境
指针类型的意义
两件事情:
1.指针类型进行+1/-1的操作时,它会跳过几个字节。
2.进行解引用操作的时候,决定了解引用操作时候的权限,(访问多少个字节)
指针的运算
1。+-整数
2.指针-指针
3.指针的关系运算
指针数组
本质上就是数组,数组中存放的是指针(地址)。
arr 存放了三个元素,每个元素都是int*类型,也就是指针,那么arr就是指针数组。
int main()
{int *pa;int *pb;int *pc;int* arr = { pa,pb,pc };return 0;
}

数组名是什么
1.数组名在大部分情况下表示数组首元素的地址,
但是有两个例外:
a)sizeof(数组名),表示的是整个数组的大小
b)&数组名,取出的是整个数组的地址
数组指针
&数组名,这里的parr ,存放的是数组的地址,parr为数组指针。
数组指针:int (*parr)[10],parr与*结合,代表parr为指针,[10]表示parr指向数组,数组中元素的类型是int。
指针数组:int* parr[10],没有括号,parr与[10]结合,表示parr为数组,数组中元素的类型是int*(整形指针)
数组指针类型的表示:int (*)[10];
int arr[10] = {1,2,3};
int (*parr)[10] = &arr;
函数指针
函数指针就是函数的地址,函数也有地址,我们可以通过函数的地址去使用函数。
函数的地址存放在函数指针变量中,
函数指针类型表示:
int (*)(int,int)
int (*pf)(int ,int),pf与*结合,表示pf是指针,指针指向的是(int , int)参数是两个整形的函数,函数的返回类型是int。
int Add(int x,int y)
{return x + y;
}int main()
{int (*pf)(int ,int) = &Add;int sum = (*pf)(2,3);//Add 和 &函数名一样,Add也可以直接表示为地址,因此也可以写成这种形式//int (*pf)(int ,int) = Add;//Add传给了pf,pf 等同于 Add ,那么我们也可以这样写。 //int sum = pf(2.3)return 0;
}
函数指针数组
存放函数指针的数组。
我们将函数指针数组命名为arr,arr数组的每个元素的类型是:int (*)(int,int)
函数指针数组的类型表示:
int (*[4])(int,int)
怎么理解这函数指针数组的形式?
arr与[4]结合,说明arr是数组,这个数字的每个元素是int(*)(int,int),而这正好是函数指针类型。
int (*arr[4])(int,int) = {Add,Sub,Div,Mul};

回调函数
通过函数指针调用的函数就是回调函数。
这里的函数指针是pf,pf指向的函数是Add,通过pf调用Add,我们称Add为回调函数。
int Add(int x,int y)
{return x + y;
}int main()
{int (*pf)(int ,int) = Add;int sum = pf(2.3);return 0;
}
笔试题
一维数组
题目:
以下打印的结果分别是什么?
int a[] = {1,2,3,4};
1|printf("%d\n",sizeof(a));
2|printf("%d\n",sizeof(a+0));
3|printf("%d\n",sizeof(*a));
4|printf("%d\n",sizeof(a+1));
5|printf("%d\n",sizeof(a[1]));
6|printf("%d\n",sizeof(&a));
7|printf("%d\n",sizeof(*&a));
8|printf("%d\n",sizeof(&a+1));
9|printf("%d\n",sizeof(&a[0]));
10|printf("%d\n",sizeof(&a[0]+1));
数组名的理解,指针的运算和指针类型的意义
解析:
1.printf (" %d\n ", sizeof ( a ) ); 16
sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
2.printf (" %d\n ", sizeof( a+0 ) ); 4 / 8
a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址。是地址,大小就是4 / 8个字节。地址的大小和环境有关,32位的系统环境就是4个字节,64位系统环境就是8个字节。
3.printf (" %d\n ", sizeof( *a ) ); 4
*a中的a是数组数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素,
首元素是整形,所占内存大小是4个字节
4.printf (" %d\n ", sizeof( a+1 ) ); 4 / 8
a不是单独放在sizeof的内部,a表示的是首元素的地址,a+1就是数组第二个元素的地址
地址的大小是4个字节或者8个字节。
5.printf (" %d\n ", sizeof( a[1] ) ); 4
a[1]表示的是数组的第二个元素,作为整形元素的大小为4个字节
6.printf (" %d\n ", sizeof( &a ) ); 4 / 8
&a,&数组名,这里的a表示的是整个数组的地址,一共4个元素,地址的大小是4个字节。虽然说是整个数组的地址,但是还是通过首元素的地址来表达。
注意:首元素的地址和数组的地址虽然表现是同一个地址,但是它们的运算的结果是不一样的。
比如:&a+1和a+1,一个表示的是跳过了一个(4个整形元素的)数组的地址,一个表示的是数组第二个元素的地址


7.printf (" %d\n ", sizeof( *&a ) ); 16
&a取的是整个数组的地址,对&a进行解引用,得到的是整个数组,一共4个元素,一个整形元素的大小为4个字节,一共是16个字节
8.printf (" %d\n ", sizeof( &a+1 ) ); 4 / 8
&数组名,取的是整个数组的地址,&a再加上1,就是跳过一个数组的位置,然后再取了一个相同大小数组的地址。&a+1还是地址,地址的大小就是4 / 8个字节。

9.printf (" %d\n ", sizeof( &a[0] ) ); 4 / 8
&a[0]取的是数组第一个元素的地址,大小是4个字节或者8个字节。
10.printf (" %d\n ", sizeof( &a[0]+1 ) ); 4 / 8
&a[0],取的是数组第一个元素的地址,&a[0]+1就是数组第二个元素的地址。大小是4个字节或者8个字节。

总结:
1.数组名大多数表示首元素的地址,有两个例外:1.sizeof(数组名)2.&数组名。数组名表示的是整个数组 。
2.不同类型地址跳过的字节不一样,&a+1,&a表示的是整个数组,+1就会跳过一个数组的大小。&a[0]+1,&a[0]是数组第一个元素的地址,所以+1跳过的是一个元素的大小。
3.地址意义可能不同,但是地址的大小都是4 / 8个字节。
字符数组
题目1:
以下打印的结果是什么?
char arr[] = {'a','b','c','d','e','f'};
1|printf("%d\n",sizeof(arr));
2|printf("%d\n",sizeof(arr+0));
3|printf("%d\n",sizeof(*arr));
4|printf("%d\n",sizeof(arr[1]));
5|printf("%d\n",sizeof(&arr));
6|printf("%d\n",sizeof(&arr+1));
7|printf("%d\n",sizeof(&arr[0]+1));
解析:
1| printf (" %d\n " , sizeof ( arr ) ) 6
sizeof(数组名),取的是整个数组的大小,字符数组arr一共6个元素,所以大小为6个字节。
2|printf (" %d\n ", sizeof( arr+0 ) ) 4 / 8
arr并没有单独放在sizeof内部,所以arr表示首元素的地址,arr+0也表示首元素的地址。是地址,那么大小就为4个字节或者8个字节。
3|printf (" %d\n ",sizeof ( *arr ) ) 1
arr是首元素的地址,就是 ‘a’ 的地址,然后解引用,就是‘a’,char类型,大小是1个字节。
*arr 等价于arr [ 0 ]
*(arr+0) 等价于 arr [ 0 ]
4|printf (" %d\n ", sizeof( arr[1] ) ) 1
arr[1]是数组第二个元素,‘b',大小是1个字节。
5|printf (" %d\n ", sizeof( &arr ) ) 4 / 8
&arr取的是数组的地址,是地址就是4 / 8 个字节。
6|printf (" %d\n ", sizeof( &arr+1 ) ) 4 / 8
&arr取的是arr数组的地址,&arr+1跳过一个(6个字符元素的)数组,下图是&arr+1的地址位置,是地址,大小就是4个字节或者8个字节。

7|printf (" %d\n ", sizeof( &arr[0]+1 ) ) 4 / 8
&arr[0]取的是数组第一个元素的地址,&arr[0]+1就是第二个元素的地址,是地址,就是4个字节或者8个字节。
题目2:
以下的打印结果分别是什么?
char arr[] = {'a','b','c','d','e','f'};
1|printf("%d\n",strlen(arr));
2|printf("%d\n",strlen(arr+0));
3|printf("%d\n",strlen(*arr));
4|printf("%d\n",strlen(arr[1]));
5|printf("%d\n",strlen(&arr));
6|printf("%d\n",strlen(&arr+1));
7|printf("%d\n",strlen(&arr[0]+1));
解析:
strlen
用来求字符串长度的库函数,参数是地址,从参数传来的地址开始,直到有' \0 '停止。

1|printf (" %d\n ", strlen ( arr ) ) 随机值
arr为数组首元素的地址,字符数组没有' \0 ',strlen会运行完数组,还会继续运行,直到遇到' \0',但是数组外的元素不由数组控制,也就是说,' \0 '什么时候出现是不可知的,所以会打印随机值。
下图遇到' \0 '前一共19个元素,所以打印结果为19。
' \0 '的ASCII的数字就是0.

2|printf (" %d\n ", strlen ( arr+0 ) ) 随机值
arr+0也是首元素的地址,其实和前面问题的随机值是一样的。这里也将会在第20个元素遇到 ‘\0’,所以这里的随机值与 1| 一样。
3|printf (" %d\n ", strlen ( *arr ) ) 访问冲突
strlen的参数是地址,而*arr传过去的是 ’a‘ ,’a'的ASCII值为97,,不是一个地址,就会发生访问冲突,也就是野指针问题。

4|printf (" %d\n ", strlen ( arr[1] ) ) 访问冲突
和前面一个问题产生的结果一样,既然strlen函数的参数是地址,将值传过去就会产生野指针的问题。

5|printf (" %d\n ", strlen ( &arr ) ) 随机值
&arr传过去的是整个数组的地址,strlen用const char* str来接收,那么strlen又是怎么运行的呢?这里的地址和1|、2|类型不同,但是地址的位置是相同的,strlen也应该是从首元素开始一个一个筛查,直到遇到 ‘\0’ ,求字符串才算结束。所以这里和1|、2|的结果应该是一样的。
6|printf (" %d\n ", strlen ( &arr+1 ) ) 随机值 - 6
&arr+1,&arr取的是整个数组的地址,&arr+1会跳过一个(6个char类型元素的)数组,下图标记&arr+1的地址位置,strlen函数也就是从这里开始运行,直到遇到 ‘\0’ ,那么这里的结果就会比1|、2|、5|的结果少6个元素。结果:随机值 - 6


7|printf (" %d\n ", strlen ( &arr[0]+1 ) ) 随机值 - 1
&arr[0]取的是数组第一个元素的地址,&arr[0]+1就是数组第二个元素的地址,从第二个元素开始,strlen遇到 '\0' 停止,就会比1|、2|、5|的结果少1个元素。结果:随机值 - 1.

总结:
1.strlen(const char* str)传递的参数是地址,如果传递数值的话,就会产生访问冲突的问题。
2.strlen不管地址的类型,只管地址的位置,从地址的位置开始,逐个去数字符,直到遇到 \0 ,strlen就停止运行,求出字符串的长度。
题目3:
以下打印的结果是什么?
char arr[] = "abcdef";
1|printf("%d\n",sizeof(arr));
2|printf("%d\n",sizeof(arr+0));
3|printf("%d\n",sizeof(*arr));
4|printf("%d\n",sizeof(arr[1]));
5|printf("%d\n",sizeof(&arr));
6|printf("%d\n",sizeof(&arr+1));
7|printf("%d\n",sizeof(&arr[0]+1));
解析:
char arr[] = "abcdef",这个数组的元素为[ a b c d e f \0 ],一共7个元素,字符串默认以 \0 结尾。
1|printf (" %d\n ", sizeof ( arr ) ) 7
sizeof(数组名),这里的数组名表示的是整个数组,因为字符串默认为 ‘\0’ 结尾,所以这个数组有7个元素,结果为7个字节。
2|printf (" %d\n ", sizeof ( arr+0 ) ) 4 / 8
arr表示的是首元素的地址,arr+0表示首元素的地址,是地址,地址的大小为4个字节或者8个字节。
3|printf (" %d\n ", sizeof ( *arr ) ) 1
arr表示首元素的地址,*arr取的是‘a’,大小为1个字节。
4|printf (" %d\n ", sizeof ( arr[1] ) ) 1
arr[1]为数组的第二个元素,‘b’,大小为1个字节。
5|printf (" %d\n ", sizeof ( &arr ) ) 4 / 8
&arr取的是整个数组的地址,地址的大小为4个字节或者8个字节。
6|printf (" %d\n ", sizeof ( &arr+1 ) ) 4 / 8
&arr取的是整个数组的地址,&arr+1跳过1个(7个元素)的数组,跳过一个数组,但是地址的类型是不变的,是还是一个数组的地址,不过既然是地址,地址的大小为4个字节或者8个字节。
7|printf (" %d\n ", sizeof ( &arr[0]+1 ) ) 4 / 8
&arr[0]取的是数组第一个元素的地址,&arr+1就是数组第二个元素的地址,地址的大小为4个字节或者8个字节。
总结:
1.不管地址的类型是什么,只要是地址,地址的大小就是4个字节或者8个字节。
2.字符串相当于普通的字符数组,但是字符串通常默认 \0 为结尾。
3.sizeof 只关注占用内存空间的大小,不在乎内存中放的是什么。
题目4:
以下打印的结果是什么?
char arr[] = "abcdef";
1|printf("%d\n",strlen(arr));
2|printf("%d\n",strlen(arr+0));
3|printf("%d\n",strlen(*arr));
4|printf("%d\n",strlen(arr[1]));
5|printf("%d\n",strlen(&arr));
6|printf("%d\n",strlen(&arr+1));
7|printf("%d\n",strlen(&arr[0]+1));
解析:
char arr[] = "abcdef",这个数组的元素为[ a b c d e f \0 ],一共7个元素,字符串默认以 \0 结尾。
strlen是求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符的个数。
1|printf (" %d\n" , strlen ( arr ) ) 6
arr是首元素的地址,遇到 \0 停止。结果:6
2|printf (" %d\n ", strlen ( arr+0 ) ) 6

3|printf (" %d\n ", strlen ( *arr ) ) 访问冲突
传递的不是地址。
4|printf (" %d\n ", strlen ( arr[1] ) ) 访问冲突
传递的不是地址。
5|printf (" %d\n ", strlen ( &arr ) ) 6
取的是整个数组的地址,但是地址位置是首元素的地址。

6|printf (" %d\n ", strlen ( &arr+1 ) ) 随机值
跳过了一个数组,\0也包括在这个数组里面,strlen就会往下去寻找 \0 ,结果会是随机值。

7|printf (" %d\n ", strlen ( &arr[0]+1 ) ) 5
从第二个元素开始,后面遇到 \0,一共是5个元素。

总结:
1. strlen是求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符的个数。
2.sizeof 只关注占用内存空间的大小,不在乎内存中放的是什么。
题目5:
char* p = "abcdef";
1|printf("%d\n",sizeof(p));
2|printf("%d\n",sizeof(p+1));
3|printf("%d\n",sizeof(*p));
4|printf("%d\n",sizeof(p[0]));
5|printf("%d\n",sizeof(&p));
6|printf("%d\n",sizeof(&p+1));
7|printf("%d\n",sizeof(&p[0]+1));
答案:
这里的“abcdef”并不是数组,而是常量字符串,常量字符串在内存中有独立的地址。p接收的是首元素’a‘的地址。
1|printf (" %d\n ", sizeof ( p ) ) 4 / 8
p是 指针变量,存放的是’a‘的地址。地址的大小为4个字节或者8个字节。
2|printf (" %d\n ", sizeof ( p+1 ) ) 4 / 8
p+1是地址。
3|printf (" %d\n ", sizeof ( *p ) ) 1
*p是 ’a‘,大小是1个字节
4|printf (" %d\n ", sizeof ( p[0] ) ) 1
p[0]是’a‘,大小是1个字节。
5|printf (" %d\n ", sizeof ( &p ) ) 随机值
&p是地址,p是指针变量,p存放的是常量字符串首元素’a‘的地址,但是p的地址与常量字符串没有关系,p的地址属于二级指针,一级指针的地址。所以是随机值。

6|printf (" %d\n ", sizeof ( &p+1 ) ) 4 / 8
&p+1是地址。所以大小为4个字节或者8个字节。

7|printf (" %d\n ", sizeof ( &p[0]+1 ) ) 4 / 8
&p[0]+1是地址。&p[0]就是‘a’的地址,+1就是‘b’的地址。
题目6:
char* p = "abcdef";
1|printf("%d\n",strlen(p));
2|printf("%d\n",strlen(p+1));
3|printf("%d\n",strlen(*p));
4|printf("%d\n",strlen(p[0]));
5|printf("%d\n",strlen(&p));
6|printf("%d\n",strlen(&p+1));
7|printf("%d\n",strlen(&p[0]+1));
答案:
1|printf (" %d\n ", strlen( p ) ) 6
p是首元素‘a’的地址,往后6个元素,到 \0 停止。

2|printf (" %d\n ", strlen( p+1 ) ) 5
p+1是第二个元素的地址,往后5个元素,到 \0 停止。

3|printf (" %d\n ", strlen ( *p ) ) 访问冲突
strlen的参数为地址。
4|printf (" %d\n ", strlen ( p[0] ) ) 访问冲突
strlen的参数为地址。
5|printf (" %d\n ", strlen ( &p ) ) 随机值
p是一级指针,&p就是二级指针。p的地址和常量字符串“abcdef”没有关系。

6|printf (" %d\n ", strlen( &p+1 ) ) 随机值 - 1
&p取的是p的地址,&p指向p的下一位。

7|printf (" %d\n ", strlen ( &p[0]+1 ) ) 5
p[0]就是’a‘,&p[0]取出了’a‘的地址,&p[0]+1就是’b‘的地址。
strlen从’b‘开始往后数,一直数到 \0为止,一共是5个元素。

相关文章:
C语言进阶之笔试题详解(1)
引言: 对指针知识进行简单的回顾,然后再完成笔试题。 ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 引言: 知识简单回顾 指针是什么 指针变…...
报道|2023 INFORMS 最佳论文(部分)华人获奖者名单
编者按 本文收集了部分2023年INFORMS年会最佳论文评选的华人获奖者名单,祝贺获奖者们!如果读者身边有本文遗漏的获奖者请在文章下方评论区告诉小编。 ● George Nicholson学生论文竞赛一等奖: Bayesian Design Principles for Frequentist …...
【Docker】从零开始:12.容器数据卷
【Docker】从零开始:12.容器数据卷 1.什么是容器数据库卷2.数据的覆盖问题3.为什么要用数据卷4.Docker提供了两种卷:5.两种卷的区别6.bind mount7.Docker managed volumevolume 语法volume 操作参数 1.什么是容器数据库卷 卷 就是目录或文件,…...
Spring Boot 整合MyBatis-Plus 详解
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8,提供了 lambda 形…...
【前端】让列表像Excel单元格一样编辑
前言 领导说了一堆的话,最后总结一句就是客户很懒,客户的员工更加懒。 本着让别人节省时间的原则,提倡出了让列表和Excal的单元格一样,不仅看数据还可以随时更改数据。 查资料 根据 Jeecg-Vue3 源码介绍,从而知道是基于 Vben Admin 开源项目进行改造的。 因此在 Vben…...
数字图像处理-Matlab实验
实验一 图像增强 实验内容: 对于给定的低对比度测试图像,利用灰度图像直方图均衡化算法进行图像视觉效果增强。 对于给定的低照度彩色测试图像,结合颜色空间转换和灰度图像直方图均衡化算法进行图像视觉效果增强。 实验数据: Test1_1.jpg: Test1_2.jpg: 实验步骤: %% …...
Nginx:配置文件详解
一、Nginx配置文件 main配置段:全局配置 events段:定义event工作模式 http {}:定义http协议配置 支持使用变量: 内置变量:模块会提供内建变脸定义 自定义变量:set var_name value 二、 主…...
卷积,是什么?
其实就是对事物的作用,或者说作用力,比如说,石板上没有字,我们刻上字,便于识别,从机器视觉角度来说,就是对图像的作用力,这种作用使得能看清想要的东西,感觉还是很主观&a…...
Javascript的闭包有哪些应用?
JavaScript 中的闭包是一种强大的特性,它可以用于多种应用。以下是一些闭包在 JavaScript 中的常见应用: 1、封装私有变量: 通过闭包,可以创建私有变量和方法。外部作用域无法直接访问闭包内的变量,从而实现了信息隐藏…...
LCM-LoRA模型推理简明教程
潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像,从而可以在几乎实时的设置中使用扩散模型。 来自官方网站: LCM 只需 4,000 个训练步骤(约 32 个 A100 GPU 小时)即可从任何预训练的稳定扩散 (SD) 中提取出来&#…...
设计模式-开篇
什么是设计模式 设计模式是一种被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式不是可直接转化为代码的完成解决方案,而是描述了如何解决一个问题的经过…...
HashMap的实现原;HashMap的工作原理;HashMap存储结构; HashMap 构造函数
文章目录 说一下HashMap的实现原理(非常重要)①HashMap的工作原理HashMap存储结构常用的变量HashMap 构造函数tableSizeFor() put()方法详解hash()计算原理resize() 扩容机制get()方法为什么HashMap链表会形成死循环 HashMap是我们在工作中使用到存储数据特别频繁的数据结构&am…...
JavaScript 原型,原型链的特点
JavaScript 的原型(Prototype)和原型链(Prototype chain)是 JavaScript 面向对象编程中的重要概念。 原型(Prototype) 在 JavaScript 中,每个对象都有一个原型对象,而这个原型对象…...
越南服务器租用:企业在越南办工厂的趋势与当地(ERP/OA等)系统部署的重要性
近年来,越南逐渐成为全球企业布局的热门目的地之一。许多企业纷纷选择在越南设立工厂,以利用其低廉的劳动力成本和优越的地理位置。随着企业在越南的扩张,对于当地部署ERP系统或OA系统等的需求也日益增长。在这种情况下,租用越南服…...
Qt QString与QChar总结
(一) QString 1 QString的简介 QString 是Qt 中的一个类,用于存储字符串,QString 没有父类。QString 存储的是一串字符,每个字符是一个 QChar 类型的数据。QChar 使用的是 UTF-16 编码,一个字符包含 2字节数据。 对于超过 6553…...
Leetcode算法系列| 1. 两数之和(四种解法)
目录 1.题目2.题解解法一:暴力枚举解法二:哈希表解法解法三:双指针(有序状态)解法四:二分查找(有序状态) 1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…...
汇编-pop出栈指令
32位汇编 执行动作分为两步: 第一步:读出数据 第二步:改变栈地址 如果操作数是16位, 则ESP加2; 如果操作数是32位, 则ESP加4 espesp2 或 espesp4 格式:...
【代码】基于VMD(变分模态分解)-SSA(麻雀搜索算法优化)-LSTM的光伏功率预测模型(完美复现)matlab代码
程序名称:基于VMD(变分模态分解)-SSA(麻雀搜索算法优化)-LSTM的光伏功率预测模型 实现平台:matlab 代码简介:提出了变分模态分解(VMD)和麻雀搜索算法(SSA)与长短期记忆神经网络 (LSTM)相耦合,…...
【UnLua】在 Lua 中定义 UE 反射类型
【UnLua】在 Lua 中定义 UE 反射类型 用法 启动编辑器时遍历 Defines 目录下 lua 脚本来加载 UE 反射类型(开个临时的 Lua VM 即可)直接像 -- define a uenum in lua UEnum.EEnumGuestSomethingElse {Value1 1;Value2 2; }-- use it like a native …...
react的开发中关于图片的知识
React是一个流行的JavaScript库,用于构建用户界面。在React开发中,图片是一个非常重要的元素,可以用于美化界面和展示内容。本篇博客将详细讲解React中关于图片的知识。 1. React中使用图片 在React中使用图片非常简单,只需要使…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

✨ 猪巴戒:个人主页✨