C语言指针总结(完结篇)

news2025/1/16 1:55:41

前言

这篇博客终于迎来了指针博客的大结局,本篇主要分析习题来回顾之前的指针总结的知识点,这篇博客的题有点绕,哈哈算是经典了

个人主页:小张同学zkf

若有问题 评论区见

感兴趣就关注一下吧

4ae1d57ce93742f3b48962852326a326.jpeg


目录

1. sizeof和strlen的对比

1.1 sizeof

1.2 strlen

1.3 sizeof和strlen的对比

2. 数组和指针笔试题解析

2.1 一维数组

2.2 字符数组

2.3 二维数组

3. 指针运算笔试题解析

3.1 题目1

3.2 题目2

3.3 题目3


1. sizeof和strlen的对比

1.1 sizeof

我们在做指针习题前,再次认识下sizeof()和strlen,很多人分不清,其实这两区别特别大,sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。

sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。

1.2 strlen

strlen 是C语言库函数,功能是求字符串长度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会一直向后找 \0 字符,直到找到为止,所以可能存在越界查找。

1.3 sizeof和strlen的对比

8606dcadff7d470bab03ffce3c2ae3e8.png


2. 数组和指针笔试题解析

以下所有题牢记两个结论:

sizeof(数组名)这里的数组名代表着整个数组的大小(sizeof里只有一个数组名!!!)

&数组名 这里的数组名表示取整个数组的地址

其他数组名出现都代表首元素地址!!!!!!

2.1 一维数组

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));

 这里面元素都是int类型,一个元素大小4个字节

我们先看第一个,sizeof(a)代表什么意思那,a是数组名在sizeof里只有一个数组名,此时a代表整个元素,一个元素大小是4,则整个元素的大小就是16个字节

sizeof(a+0)此时不仅仅是数组名一个单独在sizeof里,所以这里的a代表数组首元素的地址,那首元素地址加0还是首元素地址,所以此时sizeof里是个地址,大小为4或8个字节

sizeof(*a)此时不仅仅是数组名一个单独在sizeof里,所以这里的a代表数组首元素的地址,那首元素地址解引用,所以此时sizeof里是第一个元素的大小,大小为4个字节

sizeof(a+1)此时不仅仅是数组名一个单独在sizeof里,所以这里的a代表数组首元素的地址,那首元素地址加1,所以此时sizeof里是第2个元素的地址,大小为4或8个字节

sizeof(a[1])此时不仅仅是数组名一个单独在sizeof里,所以这里的a代表数组首元素的地址,那首元素地址后面跟个数组括号,里面有个1,所以此时sizeof里是第2个元素的大小,大小为4个字节

sizeof(&a)此时不仅仅是数组名一个单独在sizeof里,但是别忘了还有一个结论,&后跟数组名代表取整个数组的地址,那整个数组的地址也是地址呀,所以此时sizeof里是地址大小,大小为4或8个字节

sizeof(*&a)&后跟数组名代表取整个数组的地址,但前面那个*解引用号把地址又解引用了,相当于此时此刻只有一个数组名在sizeof里,那此刻数组名就代表整个数组的大小,所以大小为16个字节

sizeof(&a+1)&后跟数组名代表取整个数组的地址,所以这里取整个数组的地址,那&a+1相当于跳了一个数组大小的地址,所以此时sizeof里是地址的大小,大小为4或8个字节

sizeof(&a[0])此时&后跟数组名,但是这里[]优先级比&高,所以a先与后面的【0】成为数组里第一个元素再对它取地址,那&a【0】相当于首元素地址,所以此时sizeof里是地址的大小,大小为4或8个字节

sizeof(&a[0]+1)根据以上推测第一个地址加一相当于第2个地址,既然是地址,那大小为4或8个字节


2.2 字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

这里是char类型,一个元素大小1个字节

我们先看第一个,sizeof(arr),arr是数组名在sizeof里只有一个数组名,此时arr代表整个元素,一个元素大小是1,则整个元素的大小就是6个字节

sizeof(arr+0),此时不仅仅是数组名一个单独在sizeof里,所以这里的arr代表数组首元素的地址,那首元素地址加0还是首元素地址,所以此时sizeof里是个地址,大小为4或8个字节

sizeof(*arr),此时不仅仅是数组名一个单独在sizeof里,所以这里的arr代表数组首元素的地址,那解引用就是首元素的大小,所以此时sizeof里是个元素大小,大小为1

sizeof(arr[1]),此时不仅仅是数组名一个单独在sizeof里,所以这里的arr代表数组首元素的地址,那首元素地址后面跟个数组括号,里面有个1,所以此时sizeof里是第2个元素的大小,大小为1个字节

sizeof(&arr),&后跟数组名代表取整个数组的地址,所以此时sizeof里是个地址大小,大小为4或8个字节

sizeof(&arr+1),此&后跟数组名代表取整个数组的地址,加一就是跳过一个数组的大小的地址,所以此时sizeof里是个地址大小,大小为4或8个字节

sizeof(&arr【0】+1),&后跟首元素的地址,加一是第2个元素的地址,所以此时sizeof里是个地址大小,大小为4或8个字节


char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

 那如果所有的sizeof换成strlen会是什么样子

strlen(arr)这里的arr代表首元素地址,此时从首元素读取到\0不知道什么时候读取到,所以此时为随机值

strlen(arr+0)这里的arr代表首元素地址,加0依旧是首元素的地址,此时从首元素读取到\0不知道什么时候读取到,所以此时为随机值

strlen(*arr)这里的arr代表首元素地址,解引用是一个字符,字符对应的ASC码值强制转换成地址,是个野指针,所以这里读取错误

strlen(arr【1】)这里的arr代表首元素地址,后面【1】代表第2元素大小,字符对应的ASC码值强制转换成地址,是个野指针,所以读取错误。

strlen(&arr)&后跟数组名代表取整个数组的地址,整个数组的地址也是从首元素开始读取,找到\0结束,所以是随机值。

strlen(&arr+1)跳过一个数组的地址,也是个地址,从这个地址开始读取,到\0结束,所以是个随机值

strlen(&arr【0】+1)跳过一个元素的地址,从这个地址开始读取,到\0结束,所以是个随机值


char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

来看看字符串

sizeof(arr),arr是数组名在sizeof里只有一个数组名,此时arr代表整个元素,一个元素大小是1,但别忘了字符串结束标志还有一个\0,则整个元素的大小就是7个字节

sizeof(arr+0),此时不仅仅是数组名一个单独在sizeof里,所以这里的arr代表数组首元素的地址,那首元素地址加0还是首元素地址,所以此时sizeof里是个地址,大小为4或8个字节

sizeof(*arr),此时不仅仅是数组名一个单独在sizeof里,所以这里的arr代表数组首元素的地址,那解引用就是首元素大小,所以此时sizeof大小为1个字节

sizeof(arr【1】),此时不仅仅是数组名一个单独在sizeof里,所以这里的arr代表数组首元素的地址,那首元素地址后面跟个数组括号,里面有个1,所以此时sizeof里是第2个元素的大小,所以此时sizeof大小为1个字节

sizeof(&arr),此&后跟数组名代表取整个数组的地址,所以此时sizeof里是个地址大小,大小为4或8个字节

sizeof(&arr+1),此&后跟数组名代表取整个数组的地址,加一就是跳过一个数组的大小的地址,所以此时sizeof里是个地址大小,大小为4或8个字节

sizeof(&arr【0】+1),&后跟首元素的地址,加一是第2个元素的地址,所以此时sizeof里是个地址大小,大小为4或8个字节


char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

字符串数组换成strlen是什么情况那

strlen(arr)这里的arr代表首元素地址,此时从首元素读取到\0就停止,所以此时为6

strlen(arr+0)这里的arr代表首元素地址,加0还是首元素地址,此时从首元素读取到\0就停止,所以此时为6

strlen(*arr)这里的arr代表首元素地址,解引用是一个字符,字符对应的ASC码值强制转换成地址,是个野指针,所以这里读取错误

strlen(arr【1】)这里的arr代表首元素地址,后面【1】代表第2元素大小,字符对应的ASC码值强制转换成地址,是个野指针,所以读取错误。

strlen(&arr)&后跟数组名代表取整个数组的地址,整个数组的地址也是从首元素开始读取,找到\0结束,所以是6。

strlen(&arr+1)跳过一个数组的地址,刚好跳过了字符串的\0,也是个地址,从这个地址开始读取,到\0结束,所以是个随机值

strlen(&arr【0】+1)跳过一个元素的地址,相当于从第二个元素开始读取,到\0结束,所以是5


char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));

当换成指针变量存放字符会是什么结果那

sizeof(p)p是指针变量,指针变量的大小就是4或8个字节

sizeof(p+1)p指针指向的是第一元素指针,+1指向的是第二元素的地址,此刻还是个地址,大小就是4或8个字节

sizeof(*p)p指针指向的是第一元素指针,解引用的是第一个元素的大小,是char类型,大小为1个字节

sizeof(p[0])此时这里面可以把它看成一个数组,因为p指针是首元素的地址,相当于数组名嘛,此刻就是第一个元素的大小,大小为1个字节

sizeof(&p)此时取地址取的是p指针变量这个空间的地址,不是p指向的首元素的地址,相当于char*  *p2=&p二级指针,但此刻存放地址的地址也是地址,大小为4或8个字节

sizeof(&p+1)p指针变量的地址加1还是地址,相当于跳了一个char*指针变量的地址,大小为4或8个字节

sizeof(&p[0]+1)取首元素的地址,再加1,相当于第二个元素的地址,大小为4或8


char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

我们再看看换成strlen

strlen(p),p是首元素的地址,从首元素的地址往后读取到\0结束,长度为6

strlen(p+1),p是首元素的地址,加1是第二个元素地址,从第2个元素的地址往后读取到\0结束,长度为5

strlen(*p),p是首元素的地址,*p是第一个元素的大小,相当于字符对应的ASC码值强制转换为地址,是个野指针,则读取错误

strlen(p【0】),把它看成数组,相当于首元素大小,相当于字符对应的ASC码值强制转换为地址,是个野指针,则读取错误

strlen(&p),p指针变量的地址,相当于把p存放的地址读取到\0结束,但我不知道什么时候结束,所以是随机值

strlen(&p+1),p指针变量的地址,再加一,相当于是从p跳过一个p指针变量的地址,从这个地方把存储的东西读取到\0结束,但我不知道什么时候结束,所以是随机值

strlen(&p【0】+1),相当于首元素地址加一,是从第二个元素地址开始读取,到\0结束,大小为5


2.3 二维数组

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

哈哈哈接下来继续上强度,二维数组

b834374c3d4d4d73be6f62c1b3708b85.gif

sizeof(a)a是二维数组的数组名,当数组名单独存在sizeof()里代表的是整个数组的大小,大小为48个字节

sizeof(a【0】【0】)a不是单独存在那就代表是首元素的地址,后面跟一个数组括号里面是0代表第一行数组数组名,再跟一个数组括号里面是个0就代表第一行数组的首元素大小,大小为4个字节

sizeof(a【0】)a不是单独存在那就代表是首元素的地址,后面跟一个数组括号里面是0代表第一行数组数组名,数组名单独存在就代表这是第一行数组大小,大小为16个字节

sizeof(a【0】+1)a不是单独存在那就代表是首元素的地址,后面跟一个数组括号里面是0代表第一行数组数组名,数组名不是单独存在就代表是第一行首元素地址,加1就代表是第二个元素地址,大小为4或8个字节

sizeof(*(a【0】+1))a不是单独存在那就代表是首元素的地址,后面跟一个数组括号里面是0代表第一行数组数组名,数组名不是单独存在就代表是第一行首元素地址,加1就代表是第二个元素地址,再解引用就是第二个元素大小,大小为4字节

sizeof(a+1)a不是单独存在那就代表是首元素的地址,二维数组的首元素地址就是第一行数组的地址,第一行数组的地址加1就是第二行数组的地址,地址大小就为4或8个字节

sizeof(*(a+1))a不是单独存在那就代表是首元素的地址,二维数组的首元素地址就是第一行数组的地址,第一行数组的地址加1就是第二行数组的地址,再解引用,就是第二行数组名,数组名单独存在就代表第二行数组的大小,是16个字节

sizeof(&a[0]+1)a[0]是第一行数组名,取地址就是第一行的地址,再加一就是第二行地址,地址大小为4或8个字节

sizeof(*(&a[0]+1))a[0]是第一行数组名,取地址就是第一行的地址,再加一就是第二行地址,再解引用是第二行数组大小,大小为16个字节

sizeof(*a)a不是单独存在那就代表是首元素的地址,二维数组的首元素地址就是第一行数组的地址,再解引用就是第一行数组名,又因为第一行数组名单独存在,就代表第一行大小,大小为16个字节

sizeof(a【3】)这里肯定有人疑惑,这不是越界了吗,确实越界了,但sizeof里表达式不运算,所以根本不访问指针指向的对象,依旧可以运行,这里就相当于第四行数组名,数组名单独存在,就代表第四行大小,注意,我并不需要去访问它,只需要知道它的类型是int [4],就可以知道它的大小是16个字节


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;
}
//程序的结果是什么?

我们来分析一下,a是首元素地址,加1就是第二个元素的地址,再解引用就是第二个元素,所以第一个答案就是2,ptr是int型指针,&后跟数组名取的是整个数组的地址,加1就是跳了一个数组的地址,注意,此时被强制转换为int*指针,所以再减一,减的是整形大小,相当于现在指向的是第5个元素,再解引用就是第五个元素,所以第二个答案为5


3.2 题目2

 

//在X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结果是啥?
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;
}

分析第一个,p是结构体类型,加1就是跳了一个结构体类型,一个结构体20个字节,跳了一个就是加20,又因为是16进制数,所以大小为0x100014,但让以地址打印所以去掉符号补零,就是100014前面位置全补零,第二个,此时p强制转换为unsigned long类型,此刻注意它不是指针了,注意,它不是指针了!!是个整型,那加一个整型1就是直接加一,结果就是100001高位补零就行,第三个是整型指针类型,加1就是跳过4个字节,那结果就是100004高位补零就行。


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,3,5,a[0]是第一行数组名,代表第一行首元素地址,用指针p表示,那p[0]就是第一行首元素,结果就是1


OK,指针这块就完全结束了,喜欢的各位可以点赞,对指针还是不懂的朋友可以从我的第一篇指针博客再回顾一下。

c3c704f2f35949209c4609ccffa5e758.gif0d180fd3fd844e32826b2c3c75c775ae.gif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS2学习(七) Foxy版本ros2替换中间件。

在ros2使用的过程中&#xff0c;一开始选用的foxy版本&#xff0c;后来发现&#xff0c;foxy版本的ros2有很多问题。一个是foxy版本已经停止维护了。另一个问题是这个版本有很多bug, 后续的版本在功能实现上做了很大的改动&#xff0c;甚至说进行了重写。修复的一些问题&#x…

Sora正在颠覆游戏行业,CEO们该怎么应对?

文 | 魏力 发布 | 大力财经 摘要&#xff1a;AI 提升游戏制作效率&#xff0c;带来多样化和技术突破。在 AI 为游戏行业带来新机遇的时代&#xff0c;游戏公司应如何把握&#xff1f; 随着ChatGPT技术的快速发展&#xff0c;游戏行业正迎来一场AI技术变革。AI技术的应用为游…

长沙银行数字化案例入选《2024IDC中国金融业数据资产管理实践与案例报告》

全球数字化经济浪潮下&#xff0c;以数字技术为代表的的新一轮技术变革正跨步引领经济发展趋势。中国金融业作为2026年底数据要素应用总体目标所聚焦的十二个行业和领域之一&#xff0c;金融业数据资产管理成功经验正逐步被探索应用。 近日&#xff0c;全球权威知名市场调研机构…

开源的前端思维导图库介绍

在开源社区中&#xff0c;有许多优秀的思维导图库可供开发者使用。这些库通常具有丰富的功能和灵活的API&#xff0c;可以满足不同需求的前端开发。以下是一些流行的开源前端思维导图库&#xff0c;以及它们的特点和区别。 1. **MindMap** 特点&#xff1a; - 基于原生…

神经网络算法——反向传播 Back Propagation

文章目录 前言 1、反向传播的本质 &#xff08;1&#xff09;前向传播&#xff08;Forward Propagation&#xff09; &#xff08;2&#xff09;反向传播&#xff08;Back Propagation&#xff09; 2、反向传播的原理 &#xff08;1&#xff09;链式法则&#xff08;Chain Rule…

arm架构服务器使用Virtual Machine Manager安装的kylin v10虚拟机

本文中使用Virtual Machine Manager安装kylin v10的虚拟机 新建虚拟机 新建虚拟机 选择镜像&#xff0c;下一步 设置内存和CPU&#xff0c;下一步 选择或创建自定义存储&#xff08;默认存储位置的磁盘空间可能不够用&#xff09; 点击管理&#xff0c;打开选择存储卷页…

“轻松掌握财务状况:智能筛选银行卡收支明细,一键统计总花销”

在快节奏的现代生活中&#xff0c;财务管理成为我们日常的重要任务。你是否经常为了查看银行卡账户的收支明细而烦恼&#xff1f;是否想要快速统计出账户的总花销&#xff0c;以便更好地掌握自己的财务状况&#xff1f;现在&#xff0c;我们为你带来了一款全新的财务管理工具&a…

校招中的“熟悉linux操作系统”一般是指达到什么程度?

校招中的“熟悉linux操作系统”一般是指达到什么程度&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&am…

【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件

文章目录 一、Cloth组件解释基本介绍出于性能的考虑, 可以对Cloth产生影响的Collider只有两种打开编辑模式绘制 二、基本使用1. 创建出一个空物体2. 在空物体上添加cloth组件&#xff0c;可以直接点击Add Component搜索cloth添加&#xff0c;也可以在工具栏 Component–>phy…

动态规划(算法竞赛、蓝桥杯)--树形DP树的中心

1、B站视频链接&#xff1a;E34 树形DP 树的中心_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N20010; int n,a,b,c,ans2e9; struct edge{int v,w;}; vector<edge> e[N]; int d1[N],d2[N],path[N],up[N];//path记录d1 void dfs1(in…

【Datawhale组队学习:Sora原理与技术实战】

Transformersdiffusion技术背景简介 Transformers diffusion背景 近期大火的OpenAI推出的Sora模型&#xff0c;其核心技术点之一&#xff0c;是将视觉数据转化为Patch的统一表示形式&#xff0c;并通过Transformers技术和扩散模型结合&#xff0c;展现了卓越的scale特性。 被…

iStoreOS系统-HomeAssistant服务下载安装HACS

iStoreOS系统-HomeAssistant服务下载安装HACS 1. HACS HACS&#xff08;Home Assistant Community Store&#xff09;是Home Assistant的一个插件商店&#xff0c;它允许用户轻松地浏览、安装和管理各种为Home Assistant开发的自定义插件和集成。通过HACS&#xff0c;用户可以…

Linux Ubuntu系统安装MySQL并实现公网连接本地数据库【内网穿透】

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…

创新驱动!HubSpot引领CRM革命

在当今高速发展的数字化时代&#xff0c;企业的国际化布局和市场开拓已经成为了一种必然的趋势。随着企业出海步伐的加快&#xff0c;有效的客户关系管理&#xff08;CRM&#xff09;和营销自动化工具变得尤为重要。这就是HubSpot发力的领域。HubSpot&#xff0c;作为一家领先的…

【MATLAB】 CEEMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 CEEMD信号分解算法 CEEMD 分解又叫互补集合经验模态分解&#xff0c;英文全称为 Complementary Ensemble Empirical Mode Decomposition。 CEEMD是对EEMD的改进&#xff0c;它在EEMD的基础上引入了一个…

CRichEditUI中文乱码问题(Duilib)

这是遇到问题的时候&#xff0c;我还以为是韩文 解决方案&#xff1a; //HMODULE hmod LoadLibrary(_T("msftedit.dll"));HMODULE hmod LoadLibrary(_T("riched20.dll"));//修改一下使用的动态库&#xff0c;兼容性问题需要自己测

[HackMyVM]靶场 Wild

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 …

【MySQL】用户管理 -- 详解

如果我们只能使用 root 用户&#xff0c;这样存在安全隐患。这时就需要使用 MySQL 的用户管理。 一、 用户 1、用户信息 MySQL 中的用户都存储在系统数据库 MySQL 的 user 表中。 字段解释&#xff1a; host&#xff1a;表示这个用户可以从哪个主机登陆&#xff0c;如果…

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…

销售管理之反向与正向目标控制

在销售活动中&#xff0c;控制力是关键。但控制力其实分为两种&#xff1a;反向控制和正向控制。本文将深入探讨这两种控制方式&#xff0c;并阐述如何在销售活动中加以应用&#xff0c;以提升销售效果。 一、反向控制&#xff1a;以客户为中心&#xff0c;引导客户需求 反向控…