【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
文章目录
- 【C 语言篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
- 前言
- 一 、指针的介绍与使用
- 1. 指针的介绍
- 1.1指针表示
- 1.2指针变量
- 1.3空指针
- 2. 使用指针
- 2.1交换两个变量的值
- 2.2计算输出最小值和最大值
- 二、野指针的介绍与使用
- 1. 野指针的介绍
- 2. 野指针的两种常见情况
- 2.1指向已释放的内存
- 2.2未初始化的指针
- 3. 野指针带来的问题
- 4. 如何避免野指针
- 三、指针和数组
- 1. 指针与数组的关系
- 2. 指针和数组的示例
- 3. 指针与数组名[下标]的关系
- 4. 遍历数组
- 四、指针数组
- 1. 指针数组的定义
- 2. 指针数组的使用
- 五、数组指针
- 1. 指针数组的定义
- 2. 数组的地址和数组首元素的地址的区别
- 结语
【C 语言篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!
👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!
🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对编程感兴趣的朋友,让我们一起进步,共同提升!
前言
指针是 C 语言中强大而精妙的工具,其在内存操作与数据处理方面展现出独特的魅力,广泛应用于各类复杂的编程场景。本篇中,我们将深入且细致地探究指针的基本原理、多样化的类型、灵活多变的运算规则。
本文我们主要来介绍指针:
一 、指针的介绍与使用
1. 指针的介绍
在C语言中,指针是一种变量,其值为另一个变量的地址。通过指针,可以间接访问和操作所指向变量的值,它为C语言提供了强大的底层操作能力和灵活的数据处理方式。指针就是保存地址的变量(可以说指针就是地址)
1.1指针表示
int i;
int* p = &i;//(P是一个指针 我们通常会用P表示指针 (point的缩写))
这里的星号表示P是一个指针 指向的是int 然后把i的地址交给了p
int* p,q;
int *p,q;
注意了:
上面这两行代码是一样的,都表示p是一个指针指向int。
而q只是一个int型的变量 int q;
我们并不是把加给了int 而是把星号交给了p,所以我们说p是一个int
如果q也要是指针的话那么也需要加*
int *p,*q;
1.2指针变量
- 变量的值是内存的地址
- 普通变量的值是实际的值
- 指针变量的值是具有实际值的变量的地址
作为参数的指针
- void f(int *p);
- 在调用时得到某个变量的地址
- int i =0;f(&i);
- 在函数里面可以通过这个指针访问外面的这个;
#include <stdio.h>
void f(int *p);
int main(void)
{int i = 6;printf("&i=%p\n",&i);f(&i);return 0;
}
void f(int *p)
{printf("p=%p\n",p);
}
这里如果输出的话 就是两个地址值
&i=000000000061FE1C
p=000000000061FE1C
1.3空指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。
赋为 NULL 值的指针被称为空指针。
NULL 指针是一个定义在标准库中的值为零的常量
#include <stdio.h>
int main (){int *ptr = NULL; printf("ptr 的地址是 %p\n", ptr ); return 0;
}
结果:
ptr 的地址是 0x0
在大多数的操作系统上,程序不允许访问地址为0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
如需检查一个空指针,可以使用 if 语句,如下所示:
if(ptr) /* 如果 p 非空,则完成 */
if(!ptr) /* 如果 p 为空,则完成 */
2. 使用指针
在运用指针的过程中,通常会反复执行以下几个关键步骤:首先是创建一个指针变量,。接着,要把一个普通变量在内存中的地址传递给这个指针,让指针“知道”该去哪个位置找数据。而当我们想要获取指针所指向的那个内存地址中存放的具体值时,就会用到一元运算符“*”。下面的示例就详细展示了这些操作是如何一步步实现的:
- *是一个单目运算符,用来访问指针的值所表示的地址上的变量
- 可以做右值也可以做左值
int k = *p
*p = k+1
如果我把星号和指针变量联系在一起后 *p的整体其实都可以被看作是一个整数
#include <stdio.h>
void f(int *p);
void g(int k);
int main(void)
{int i = 6;printf("&i=%p\n",&i);f(&i);g(i);return 0;
}
void f(int *p)
{printf("p=%p\n",p);printf("*p=%p\n",*p);*p = 26;
}
void g(int k)
{printf("k=%d\n",k);
}
输出结果:
&i=000000000061FE1C
p=000000000061FE1C
*p=0000000000000006
k=26
2.1交换两个变量的值
示例代码:
#include <stdio.h>
void swap(int *pa,int *pb);int main(void)
{int a = 5;int b = 6;swap(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;
}
void swap(int *pa,int *pb)
{int t = *pa;*pa = *pb;*pb = t;
}
代码结果:
a=6,b=5
2.2计算输出最小值和最大值
指针的应用场景2
- 函数返回多个值,某些值就只能通过指针返回
- 传入的参数实际上是需要保存带回的结果的变量
#include <stdio.h>
void minmax(int a[],int len,int *max,int *min);int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,15};int min,max;minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);//调用 minmax 函数,将数组 a、数组元素的个数(通过 sizeof(a)/sizeof(a[0]) 计算得到),以及 min 和 max 的地址传递过去,以便在函数内修改它们的值printf("min=%d,max=%d\n",min,max);return 0;
}
void minmax(int a[],int len,int *min,int *max)
{int i;*min = *max=a[0];//将数组的第一个元素赋值给 min 和 max,初始假定数组的最小值和最大值都是第一个元素。for ( i=1;i<len;i++){if ( a[i] < *min){*min = a[i];}if(a[i] >*max){*max = a[i];}}
}
输出结果
min=1,max=15
二、野指针的介绍与使用
1. 野指针的介绍
在 C 语言中,野指针(Dangling Pointer)是指一个指针指向一个已经被释放或者没有初始化的内存地址。访问这些内存地址会导致未定义的行为,可能导致程序崩溃、内存泄漏或数据损坏。
2. 野指针的两种常见情况
2.1指向已释放的内存
当通过 free()
释放了动态分配的内存后,指针仍然持有原来内存的地址,但该内存块已不再有效。这时,指针变成了野指针。
int* ptr = (int*)malloc(sizeof(int)); // 动态分配内存
*ptr = 10; // 使用指针
free(ptr); // 释放内存
// ptr 现在是一个野指针
2.2未初始化的指针
如果一个指针声明时没有被初始化,它的值将是一个随机的地址。这个地址指向的内存可能是无效的,或者是程序不应该访问的内存区域。
int* ptr; // 未初始化的指针,指向一个未知的地址
*ptr = 10; // 访问未初始化的指针,会引发未定义行为
3. 野指针带来的问题
- 程序崩溃:访问无效的内存地址会导致程序崩溃,尤其是在访问已释放的内存时。
- 数据损坏:如果野指针指向的是已经被重新分配的内存区域,程序通过该指针修改数据,可能会损坏原有数据。
- 内存泄漏:如果指针指向的内存已被释放,但没有将指针置为
NULL
,程序仍然持有该地址的引用,可能会导致无法再次访问该内存块,造成内存泄漏。
4. 如何避免野指针
-
及时将指针置为
NULL
:
在释放内存后,立即将指针赋值为NULL
。这样可以防止后续访问已经释放的内存。int* ptr = (int*)malloc(sizeof(int)); free(ptr); // 释放内存 ptr = NULL; // 防止野指针
-
初始化指针:
在声明指针时,尽量将其初始化为NULL
,这样即使没有正确赋值,也不会指向一个随机的内存地址。int* ptr = NULL; // 初始化为NULL
-
谨慎使用
free()
:
每次释放内存后,确保不再使用该内存区域。并且,只有在内存不再被使用时才调用free()
。
尽量不要使用以下代码
#include <stdio.h>
#include <stdlib.h>int main() {// 动态分配内存int *ptr = (int *)malloc(sizeof(int));if (ptr == NULL) {printf("内存分配失败!\n");return 1;}// 给指针指向的内存区域赋值*ptr = 42;printf("指针指向的值: %d\n", *ptr);// 释放动态分配的内存free(ptr);// ptr 仍然指向之前的内存地址,此时 ptr 成为野指针// 此时访问 *ptr 是未定义行为,应该避免这样做// printf("指针指向的值: %d\n", *ptr); // 这一行可能导致程序崩溃return 0;
}
以下是将上述代码示例进行相似替换后的内容展示(代码功能逻辑基本一致,但可能在具体数值等细节上做了些许变化):
三、指针和数组
1. 指针与数组的关系
指针和数组在C语言中有非常紧密的关系,主要体现在以下几个方面:
- 数组名与首元素地址:在大多数情况下,数组名代表的就是数组首元素的地址。例如,对于
int arr[] = { 5, 2, 0 };
,arr
和&arr[0]
的值是相等的,它们都指向数组的第一个元素。这意味着可以使用指针来操作数组元素,就好像指针就是数组本身一样。 - 数组的地址和首元素地址的区别:虽然数组名大多数情况下表示首元素地址,但
&arr
和arr
在概念上是有区别的。&arr
是整个数组的地址,而arr
是首元素的地址。当对它们进行指针运算时,这种区别就会体现出来。例如,对于int arr[10];
,&arr + 1
的值比arr + 1
的值大sizeof(arr)
,因为&arr + 1
是跳过了整个数组的地址,而arr + 1
只是跳过了一个元素的地址。
2. 指针和数组的示例
#include <stdio.h>int main()
{int arr[] = { 8, 4, 6 };int* pb = &arr[0];printf("%p\n", arr);printf("%p\n", pb);return 0;
}
代码结果:
000000000061FE0C
000000000061FE0C
从上面的结果中我们可以发现:
arr
是数组名,pb
是首元素的地址,而两者的值相等。
结论:数组名大多数情况都是首元素地址。
3. 指针与数组名[下标]的关系
#include <stdio.h>int main()
{int arr[] = { 2, 5, 3, 7, 9, 1, 0 };int* pb = &arr[0];for (int i = 0; i < 7; i++){printf("&arr[%d]: %p <---> pb + %d: %p\n", i, &arr[i], i, pb + i);}return 0;
}
代码运行结果:
&arr[0]: 000000000061FDF0 <---> pb + 0: 000000000061FDF0
&arr[1]: 000000000061FDF4 <---> pb + 1: 000000000061FDF4
&arr[2]: 000000000061FDF8 <---> pb + 2: 000000000061FDF8
&arr[3]: 000000000061FDFC <---> pb + 3: 000000000061FDFC
&arr[4]: 000000000061FE00 <---> pb + 4: 000000000061FE00
&arr[5]: 000000000061FE04 <---> pb + 5: 000000000061FE04
&arr[6]: 000000000061FE08 <---> pb + 6: 000000000061FE08
从上面的代码运行结果可以得出:指针(首元素地址)±整数与&数组名[下标]
是相同的。
4. 遍历数组
- 下标遍历与指针(地址)±整数遍历
#include <stdio.h>int main()
{int arr[] = { 2, 5, 3, 7, 9, 1, 0 };int* pb = &arr[0];for (int i = 0; i < 7; i++){printf("arr[%d]: %d <---> *(pb + %d): %d\n", i, arr[i], i, *(pb + i));}return 0;
}
代码运行结果:
arr[0]: 2 <---> *(pb + 0): 2
arr[1]: 5 <---> *(pb + 1): 5
arr[2]: 3 <---> *(pb + 2): 3
arr[3]: 7 <---> *(pb + 3): 7
arr[4]: 9 <---> *(pb + 4): 9
arr[5]: 1 <---> *(pb + 5): 1
arr[6]: 0 <---> *(pb + 6): 0
从上述代码运行情况可以得知:下标和指针(地址)±整数都能够遍历数组。
- 下标遍历与数组名±整数遍历
#include <stdio.h>int main()
{int arr[] = { 2, 5, 3, 7, 9, 1, 0 };int* pb = &arr[0];for (int i = 0; i < 7; i++){printf("arr[%d]: %d <---> *(arr + %d): %d\n", i, arr[i], i, *(arr + i));}return 0;
}
从代码运行结果可以得出:下标和数组名±整数都可以遍历数组。
- 数组首元素地址代替数组名遍历
#include <stdio.h>int main()
{int arr[] = { 2, 5, 3, 7, 9, 1, 0 };int* pb = &arr[0];for (int i = 0; i < 7; i++){printf("pb[%d]: %d <---> *(pb + %d): %d\n", i, pb[i], i, *(pb + i));}return 0;
}
从代码运行表现来看,我们可以得出:数组首元素地址可以代替数组名。
结论:
- 指针(首元素地址)±整数与
&数组名[下标]
是相同的。 - 下标和指针(首元素地址)±整数都能够遍历数组。
- 下标和数组名±整数都可以遍历数组。
- 数组首元素地址可以代替数组名。
arr[i] = *(arr + i) = *(pb + i) = pb[i]
四、指针数组
1. 指针数组的定义
指针数组是一种存储指针的数组。
#include <stdio.h>int main()
{int arr1[] = { 3, 6, 2, 2, 4, 2, 5 };int arr2[] = { 3, 6, 1, 2, 4, 2, 5 };int arr3[] = { 7, 5, 3, 1, 1, 1, 1 };int* pArr[] = { arr1, arr2, arr3 };int i = 0;for (i = 0; i < 3; i++){printf("%p\n", pArr[i]);}return 0;
}
代码运行结果:
000000000061FE00
000000000061FDE0
000000000061FDC0
2. 指针数组的使用
指针数组是存储一级指针的数组,而一级指针指向的是数组,其使用与二维数组有些相似,但二者并不能完全等同看待。
#include <stdio.h>int main()
{int arr1[] = { 3, 6, 2, 2, 4, 2, 5 };int arr2[] = { 3, 6, 1, 2, 4, 2, 5 };int arr3[] = { 7, 5, 3, 1, 1, 1, 1 };int* pArr[] = { arr1, arr2, arr3 };int i = 0;for (i = 0; i < 3; i++){for (int j = 0; j < 7; j++){printf("%d ", pArr[i][j]);}printf("\n");}return 0;
}
代码运行结果:
3 6 2 2 4 2 5
3 6 1 2 4 2 5
7 5 3 1 1 1 1
五、数组指针
1. 指针数组的定义
数组指针是用来存放数组地址的指针。
数组指针变量如何定义:(假设这里的指针变量是q
,数组存放的int
类型的变量)
- 首先它是指针那么就不能与
[ ]
先结合 ---- (*q
) - 其次它指向的内容是数组 ---- (
*q)[ ]
----[ ]
中为数组的元素个数 - 最后它指向数组存储变量的类型是什么 ----
int(*q)[ ]
#include <stdio.h>int main()
{int arr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };int(*q)[8] = &arr;printf("%p", q);return 0;
}
2. 数组的地址和数组首元素的地址的区别
- 区别:(
&arr
与arr
)
取出数组的地址和数组首元素的地址有什么区别
#include <stdio.h>int main()
{int arr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };printf("%p\n", &arr); //打印数组的地址printf("%p\n", arr); //打印数组首元素的地址printf("%p\n", &arr[0]); //打印数组首元素的地址return 0;
}
这里取出数组的地址和数组首元素的地址看起来好像没什么区别
让它们取出来的地址+1
试试。
#include <stdio.h>int main()
{int arr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; // 定义并初始化一个包含8个整数的数组printf("%p\n", &arr); // 打印整个数组的地址,类型为 int (*)[8]printf("%p\n", arr); // 打印数组首元素的地址,类型为 int *printf("%p\n", &arr[0]); // 打印数组首元素的地址,与上面的结果相同printf("\n");printf("%p\n", &arr + 1); // 打印整个数组的地址加1,跳过整个数组的大小(8个int),指向下一个内存块printf("%p\n", arr + 1); // 打印数组首元素的地址加1,指向第二个元素 arr[1] 的地址printf("%p\n", &arr[0] + 1); // 打印数组首元素的地址加1,指向第二个元素 arr[1] 的地址,与上面的结果相同return 0;
}
代码运行结果:
000000000061FE00
000000000061FE00
000000000061FE00000000000061FE20
000000000061FE04
000000000061FE04
上文总结:
&arr 和 arr 在打印时,地址看似相同,但在进行算术运算时产生的结果是不同的。
&arr + 1 指向的是整个数组后的地址,而 arr + 1 和 &arr[0] + 1 都是指向第二个元素 arr[1] 的地址。
结语
在 C 语言中,指针、指针数组和数组指针有着不同的特质与用途:以下是我对这三者的总结,帮助理解它们之间的区别、联系以及如何有效地使用它们。
- 指针:能够直接操控内存地址,借此间接访问和修改数据,可在函数间传递地址以避免大量数据复制,提升效率,同时为动态内存分配提供支持。
- 指针数组:用于集中存储多个同类型数据对象的地址,便于统一管理与操作,能节省内存空间并提高处理效率。
- 数组指针 **专门指向数组,便于对二维或多维数组进行高效操作与访问,简化多维数组元素的处理逻辑。
- 那么我想以上这就是【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章的内容了,通过对指针、指针数组和数组指针的学习,使我们可以在编程中更好的解决问题。❤️
意气风发,漫卷疏狂
学习是成长的阶梯,每一次的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中。
如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝点赞、评论和收藏,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会增加自己的运气,希望您每一天都能充满活力!
愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
我是意疏 下次见!
相关文章:

【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
文章目录 【C 语言篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章前言一 、指针的介绍与使用1. 指针的介绍1.1指针表示1.2指针变量1.3空指针 2. 使用指针2.1交换两个变量的值2.2计算输出最小值和最大值 二、野指针的介绍与使用1. 野指针…...

游戏关卡设计的常用模式
游戏关卡分为很多种,但常用的有固定套路,分为若干种类型。 关卡是主角与怪物、敌方战斗的场所,包括装饰物、通道。 单人游戏的关卡较小,偏线性; 联机/MMO的关卡较大,通道多,自由度高…...
在一台服务器上使用docker运行kafka集群
1.拉取镜像 docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper 2.创建集群之间通信的网络 docker network create kafka-cluster-net docker network inspect kafka-cluster-net 3.将zookeeper加入到网络中 docker network connect kafka-cluster-net zooke…...

Apache Celeborn 在B站的生产实践
背景介绍 Shuffle 演进 随着B站业务的飞速发展,数据规模呈指数级增长,计算集群也逐步从单机房扩展到多机房部署模式。多个业务线依托大数据平台驱动核心业务,大数据系统的高效性与稳定性成为公司业务发展的重要基石。如图1,目前在大数据基础架构下,我们主要采用 Spark、Fl…...
JOIN 和 OUTER JOIN,SQL中常见的连接方式
1. INNER JOIN(简称 JOIN) INNER JOIN 是 SQL 中最常用的一种连接方式,默认的 JOIN 就是 INNER JOIN。它返回两个表中满足连接条件的匹配记录。 作用:返回两个表中所有满足 ON 条件的记录。特性:如果表中的某些行在连…...

Vue2: table加载树形数据的踩坑记录
table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…...
电子信息硕士面试经验
回顾2024年秋招一些面试常见的问题,主要涉及软件开发和嵌入式部分内容。 1. 浅拷贝深拷贝 深拷贝和浅拷贝是两种不同的拷贝方式,用于复制对象。它们主要区别在于对嵌套对象的处理方式。 浅拷贝:只复制对象的顶层,嵌套对象仍然是共享引用。 深拷贝:递归复制所有对象及其嵌…...
dns网址和ip是一一对应的吗?
DNS网址和IP地址是一一对应的吗?我们在上网时,为什么总是使用网址而不是一串数字?这些问题其实涉及到互联网的基本运作原理。DNS(域名系统)是我们日常上网过程中一个不可或缺的部分,它帮助我们将人类易于记…...
springboot3 redis 常用操作工具类
在 Spring Boot 3 中,操作 Redis 通常使用 Spring Data Redis 提供的工具类,如 RedisTemplate 和 StringRedisTemplate。以下是一个详细的 Redis 操作工具类的实现,涵盖了常用功能。 完整的 Redis 工具类 以下工具类可以实现基本的 Redis 操…...

Java工程师实现视频文件上传minio文件系统存储及网页实现分批加载视频播放
Java工程师实现minio存储大型视频文件网页实现分批加载视频播放 一、需求说明 老板给我出个题目,让我把的电影文件上传到minio文件系统,再通过WEB端分配加载视频播放,类似于我们普通的电影网站。小编把Java代码共享出来。是真正的能拿过来直…...

Redis(二)value 的五种常见数据类型简述
目录 一、string(字符串) 1、raw 2、int 3、embstr 二、hash(哈希表) 1、hashtable 2、ziplist 三、list(列表) 编辑 1、linkedlist 2、ziplist 3、quicklist(redis 3.2后的列表内…...

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和…...

【网页自动化】篡改猴入门教程
安装篡改猴 打开浏览器扩展商店(Edge、Chrome、Firefox 等)。搜索 Tampermonkey 并安装。 如图安装后,浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name:脚本名称。…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力
目录 1 MHE的表示能力2 基于Frobenius-范数的低秩逼近3 基于CE的低秩近似 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:h…...
Github - unexpected disconnect while reading sideband packet
Open git global config: git config --global -eLet’s try to resolve the issue by increasing buffer: git config --global http.postBuffer 52428800Try to clone again. If that doesn’t work! > You can try the partial fetch method and disabling compressi…...

Ubuntu 环境安装 之 RabbitMQ 快速入手
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…...

UE5中实现右键开镜效果
右键之后添加时间轴,然后设置视野即可。Set Field Of View 时间轴设置,第一个点设置0,90度,因为默认的就是90度 第二个点看武器的类型或者倍境来设置,时间就是开镜时间,值越小开镜速度越快,第二个值就是视野…...

Apache HTTPD 换行解析漏洞(CVE-2017-15715)
漏洞简介 pache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。 漏洞环境 vulhub/httpd/CVE-2…...

Excel重新踩坑5:二级下拉列表制作;★数据透视表;
0、在excel中函数公式不仅可以写在单元格里面,还可以写在公式里面。 1、二级下拉列表制作: 2、数据透视表: 概念:通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览:在插入选项中有个数据透视表,数…...
力扣--35.搜索插入位置
题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 …...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...