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

【C语言】指针(1):入门理解篇

目录

一、内存和地址

1.1内存

1.2 深入理解计算机编址

 二、指针变量和地址

2.1 取地址操作符(&)

2.2 指针变量和解应用操作符

2.2.1 指针变量

2.2.2 解引用操作符

2.3指针变量的大小

三、指针变量类型的意义

 3.1 指针的解引用

3.1指针+-整数

3.3void*:无具体类型的指针

四、const修饰变量

   4.1 const修饰指针

4.2 const修饰指针变量

 五、指针运算

5.1 指针+-整数 运算

5.2 指针-指针       

5.3 指针的关系运算

六、野指针

6.1.野指针产生原因

6.1.1 指针未初始化

6.1.2 指针越界访问​编辑

6.1.3 指针指向的空间释放

6.2 如何规避野指针

6.2.1 指针初始化

6.2.2 避免越界访问   

6.2.3 当指针不再使用时,即使置NULL,指针使用前检查有效性

6.2.4 避免返回局部变量的地址     

七、assert断言     

八、理解传值调用和传址调用     

 

一、内存和地址

1.1内存

只要讲指针就离不开内存

因为指针就是访问内存的

计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数
据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢?
其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节

计算机常见单位

bit - ⽐特位
byte - 字节
KB
MB
GB
TB
PB1byte = 8bit
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB

 内存单元编号==地址==指针

1.2 深入理解计算机编址


CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,⽽因为内存中字节很多,所以需要给内存进⾏编址(就如同宿舍很多,需要给宿舍编号⼀样)。计算机中的编址,并不是把每个字节的地址记录下来,⽽是通过硬件设计完成的。

⾸先,必须理解,计算机内是有很多的硬件单元,⽽硬件单元是要互相协同⼯作的。所谓的协同,⾄少相互之间要能够进⾏数据传递。但是硬件与硬件之间是互相独⽴的,那么如何通信呢?答案很简单,⽤"线"连起来。⽽CPU和内存之间也是有⼤量的数据交互的,所以,两者必须也⽤线连起来。不过,我们今天关⼼⼀组线,叫做地址总线

32位机器有32根地址总线, 每根线只有两态,表⽰0,1【电脉冲有⽆】,那么 ⼀根线,就能表⽰2种含义,2根线就能表⽰4种含义,依次类推。32根地址线,就能表⽰2^32种含义,每⼀种含义都代表⼀个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传⼊CPU内寄存器。

int main()
{
int a = 10;//创建变量的本质是向内存申请一块空间,为a申请4个字节的空间return 0;
}

 

 对于地址总线、数据总线、控制总线可以这样理解的:

控制总线:相当于一个控制台,传递指令。

数据总线:相当于内存数据传输的通道。

地址总线:相当于一个内存仓库。

 

 二、指针变量和地址

2.1 取地址操作符(&)

int main()
{int a = 10;//&a --- &取地址操作符//& 单目操作符printf("%p\n",&a);return 0;
}

 

      对int a=10来说,创建了四个字节的空间,通过调试发现这四个字节都是有地址的,当我们通过&取地址符来得到a的地址(%p是专门用来取地址的占位符)时,实际上取出的时a所占4个字节中地址较小的字节的地址。虽然整形变量占了4个字节,但是只要知道了第1个字节的地址,顺藤摸瓜就可以访问到4个字节的数据。

2.2 指针变量和解应用操作符

2.2.1 指针变量

       通过2.1我们通过&取地址符拿到了地址,这个地址是一个数值,而将这个数值存储起来方便后期使用,就需要我们把地址值存在指针变量里。

int main()
{int a = 10;//&a --- &取地址操作符//& 单目操作符printf("%p\n",&a);return 0;
}

2.2.2 解引用操作符


      通过2.2.1,我们学会了怎么将地址保存起来,那未来我们也要有方法去取用他,就跟我们生活中我们找到一个房间,我们希望可以在这个房间里存放或者取走物品,同理,我们通过了指针变量存储的地址,通过地址找到了该地址指向的空间,这里就需要用到解引用操作符*,来取用空间里数据。

//指针--地址
//指针变量--存放地址的变量int main()
{int a = 10;//&a --- &取地址操作符//& 单目操作符//printf("%p\n",&a);int* p = &a;//p是一个变量(指针变量),是一块空间//编号-地址-指针//int说明p指向对象是int类型的//*在说明p是指针变量
return 0;
}
int main()
{char ch = 'w';char* pc = &ch;return 0;
}
int main()
{int a =10;int * p= &a;*p =0;//* -解引用操作符(间接访问操作符)//a =0;】//*&a = 0;//a = 0
printf("%d",a);//0?return 0;
}

2.3指针变量的大小

32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。

如果指针变量是⽤来存放地址的,那么指针变的⼤⼩就得是4个字节的空间才可以。同理64位器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的⼤⼩就是8个字节。

指针的变量大小与类型是无关的,只要是指针类型的变量,在相同的平台下,大小都是一样的(32位平台指针大小是4个字节,64位平台下指针大小是8个字节)

指针变量 - 存放地址的
                  地址产生:地址线上传输的
                   32根地址线 ——>地址是:32个0/1组成的二进制序列
                   要储存这样的地址:32bit位的空间 ==4个字节

int main(){printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0;}

32位:4 4 4 4

64位:8 8 8 8 

结论:
• 32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
• 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
• 注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

 

三、指针变量类型的意义

指针类型决定了指针进行解应用操作符的时候访问几个字节,也就是决定指针的权限

 3.1 指针的解引用

int main()
{ int a = 0x11223344;int * pa = &a;*pa =0;return 0;
}

//代码1
#include <stdio.h>
int main()
{int n = 0x11223344;int *pi = &n; *pi = 0; return 0;//代码2
#include <stdio.h>
int main()
{int n = 0x11223344;char *pc = (char *)&n;*pc = 0;return 0;
}

调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0。

结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

3.1指针+-整数

int main()
{int a =10;int *pa = &a;char* pc = &a;printf("pa=%p\n",pa);printf("pa+1 = %p\n",pa+1);printf("pc = %p\n",pc);printf("pc+1 = %p\n",pc+1);return 0;
}

指针类型决定了指针进行+1,-1的时候,一次走远的距离

int * +1 --->走4个字节(整型大小)

char* +1--->走了1个字节(字符大小)

3.3void*:无具体类型的指针

指针类型:

char*:指向字符的指针

short*:指向短整型的指针

int*:指向整型的指针

float*:指向单精度浮点型的指针

........

void*:无具体类型的指针,这类指针可以用来接受任意类型的地址,但是也有局限性,就是void*不能直接进行指针的+-整数和解引用运算。

#include<stdio.h>
int main()
{int a = 0;char*p = &a;//int*return 0;
}

 上面这个代码我们可以证实这个结论, 我们可以把void*想象成一个垃圾桶,可以收集任意类型数据的指针,但是无法直接去运用(解引用和+-运算)。其实void*的设计可以实现泛型编程的效果,使得一个函数可以处理多种类型的数据。

#include<stdio.h>
int main()
{int a = 0;float f = 0.0f;void* p = &a;//int*p = &f;//float*return 0;
}
#include<stdio.h>
{int a =10;void* p = &a;//*p = 20;//err//p = p +1;//errreutrn 0;
}

 

四、const修饰变量

   4.1 const修饰指针

int main()
{const int a 10;//a 具有了常属性(不能被修改了)
//a是不是常量?虽然a是不能被修改的,但是本质上还是变量
//常变量
//
//a = 20;
//在C++中const修饰的变量就是常量
//int arr[a] ;printf("%d\n",a);retrun 0;
}
int main()
{const int a = 10;
//a = 20;//err
int* p = &a;
*p = 0;
ptintf("a = %d\n",a);return 0;
}

4.2 const修饰指针变量


   创建指针变量p(int*p=&a)之前,我们首先要知道3点含义。

1.p内部存放的是a的地址,*p可以通过这个地址访问到a。

2.p本身也是变量,他有自己的地址。

3.*p是p指向的空间,也可以理解成解引用p,改变*p其实就是改变a。

int main()
{int a = 10;//&a--0x0012ff40int b = 20;//&b--0x0012ff44int * const p =&a;//0x0012ff40//p = &b;//err*p = 100;//const 修饰指针变量的时候。放*右边//const 限制的是指针变量本身,指针变量不能再指向其他变量了//但是可以通过指针变量,修改指针变量指向的内容return 0;
}
int main()
{int a = 10;int b = 20;int const * p =&a;//p = &b;//OK//*p = 100;//err//const 修饰指针变量的时候。放*左边,限制的是:指针指向的内容,不能通过指针来修改指向的内容//const 限制的是指针变量本身,指针变量不能再指向其他变量了//但是可以修改指针变量本身的值(修改的指针变量的指向)return 0;
}
int main()
{int a = 10;int b = 100;int const * const p =&a;//p = &b;//err//*p = 0;//errreturn 0;
}

const结论:

1.const如果在*左边,const修饰的是*p,也就是修饰指针指向的内容,保证指针指向的内容不能通过指针来改变,但是指针变量p本身的内容是可以改变的。

2.const如果在*右边,const修饰的是p本身,保证指针变量p的内容不能被修改,但是指针指向的内容是可以改变的。

3.如果*的两边都有const,则const不仅修饰了*p,也修饰了p本身,所以无论是指针指针指向的内容,还是指针变量本身,都是不可以被改变的。

 

 五、指针运算

5.1 指针+-整数 运算

int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int i = 0;int sz = sizeof(arr) / sizeof(arr[0])\;for (i = 0; i < sz;i++){printf("%d",arr[i]);}return 0;
}int main()
{int arr[10];int i = 0;for (i = 0; i < 10; i++){arr[i] = i + 1;//数组内10个元素分别为1 2 3 4 5 6 7 8 9 10}//通过指针来访问并打印这个数组int sz = sizeof(arr) / sizeof(arr[0]);//sz为数组元素个数//我们需要知道arr的首地址,再通过+-运算顺藤摸瓜找到后面所有元素int* p = &arr;//数组名代表数组首元素的地址for (i = 0; i < sz; i++)//如果我想访问1-10{printf("%d ", *p);p++;} //如果想访问1 3 5 7 9,则改成p+=2即可return 0;
}

5.2 指针-指针
       

通过5.1,我们知道指针+整数=指针。所以指针-指针得到的是一个整数。

       可以模拟实现strlen函数来观察指针的减法,strlen函数本质是字符串/0前面出现的元素个数,其实strlen函数传入的是字串串首元素的地址,如何通过该地址顺藤摸瓜地寻找后面的元素,知道遇到/0。

int my_strlen(char* s)
{char* p = s;while (*p != '\0')//这里也可以写成*p,因为'\0'的ascii值是0p++;//p加1一次就往后移动4个字节return p - s;//指针-指针得到的绝对值是指针之间的元素个数(前提条件:两个指针指向同一块空间。)
}
int main()
{int ret = my_strlen("abc");printf("%d", ret);return 0;
}

   指针-指针得到的是一个整数,而这个整数其实就是指针与指针之间的元素个数,但是有个前提条件就是两个指针必须指向同一块空间(比如arr[0]-crr[1]就不行)。

5.3 指针的关系运算

     指针的关系运算就是指针比较大小,可以通过运用该知识来访问数组。

int main()
{int arr[10];int i = 0;for (i = 0; i < 10; i++){arr[i] = i + 1;//数组内10个元素分别为1 2 3 4 5 6 7 8 9 10}//通过指针来访问并打印这个数组int sz = sizeof(arr) / sizeof(arr[0]);//sz为数组元素个数//我们需要知道arr的首地址,再通过+-运算顺藤摸瓜找到后面所有元素int* p = &arr;//数组名代表数组首元素的地址while (p < arr + sz){printf("%d  ", *p);p++;}return 0;
}

 p接收的是arr的首地址,而sz是元素个数,所以通过p++,p会无限接近arr最后一个元素arr[sz-1],直到打印出来之后,while循环结束。

六、野指针

概念:野指针就是指针指向的位置是不可知的

6.1.野指针产生原因

6.1.1 指针未初始化

      未初始化的变量(int *p),变量的值是随机的,无法访问(此时写*p=20会报错)

6.1.2 指针越界访问

将for循环中的i<10改成i<20,此时出现越界访问。

      当指针指向的返回超出数组的范围,就是越界访问,此时p是野指针。

6.1.3 指针指向的空间释放

上面这段代码中,调用test函数,test函数的返回值是一个局部变量,test运行后已经被释放了,但是第一张图运行还是可以运行出10这个数据,原因是我们理解的销毁其实时空间所有权被释放,当其他函数执行需要开栈帧时,会把这里给占用,但是第一张图运行时还没有函数来占用,所以10这个数据被保存了下来,而第二张图在调用test函数后面又加了一段打印hehe的代码,此时printf的调用占用了这块空间,此时再去访问得到的就是一个随机值。

      当指针指向的空间已经被释放(常见的就是调用的函数的返回值是一个局部变量,函数一调用结束该变量立刻被销毁。),p指向一块无法访问的内容,此时p是野指针。

6.2 如何规避野指针


6.2.1 指针初始化


     在指针变量创建的时候就要进行初始化,如果不知道指针应该指向哪里,那么可以将指针赋值给NULL,NULL是C函数中定义的一个标识符常量,他的值是0,地址也是0,所以读取该地址时程序会报错,相当于程序会提醒你这是个野指针,不要去使用。

6.2.2 避免越界访问
   

比如程序向内存申请了一个存放arr数组的空间,那么指针也只能访问这些空间,一定不要超出这个范围去访问。

6.2.3 当指针不再使用时,即使置NULL,指针使用前检查有效性


     当我们后期不需要使用这个指针去访问空间时,即使内置NULL,因为将指针变量设置成NULL,一旦误用后系统就会报错,这样可以把野指针暂时管理起来。

      另一方面,当我们书写了大量代码后,可能会没有及时发现野指针的出现,这时候我们可以在使用前判断是否是NULL,根据情况决定是否继续使用这个指针

6.2.4 避免返回局部变量的地址
     

局部变量在函数执行完,空间所有权就会被释放,一但其他函数执行需要开栈帧,就会占用该空间。

七、assert断言
     

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为“断⾔”。

     assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣ 任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误 流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。

 assert() 的好处:

1.⾃动标识⽂件和 出问题的⾏号

2.⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问 题,不需要再做断⾔,就在 #include 语句的前⾯,定义⼀个宏 NDEBUG (#define NDEBUG)。

assert() 的坏处:

1.因为引入了额外的检查,增加了程序的运行时间。

2.release版本中需要确保代码没问题的情况下禁用assert操作,确保影响用户使用程序的效率。(一些编译器的release需要禁用,但是vs这样的集成开发环境直接就是优化掉了)

八、理解传值调用和传址调用
     

 传值调用和传址调用本质区别就是有无用到指针,指针-指针运算模拟strlen函数的实现,其实就是传址调用的一种方法,其实有一些问题的解决不使用指针是无法解决的,比方说下面模拟swap函数的实现。

       swap函数,即通过这个函数交换两个整型变量的值。在没学习指针前,我会这样写----

 但是没有产生我们想要的效果,原因是实参传递给形参时,形参会单独创建一份临时空间来接受实参,对形参的修改不会影响到实参的值,x和y确实接收到了a和b的值,不过x的地址和a不一样,y的地址和b不一样,所以在swap函数内部去交换x和y的值,本质上不会影响到a和b,说明swap函数是失败的,这种函数调用方法在学习函数的时候就已经了解了,就是传值调用,其特点就是对形参的改变不会影响实参的数据。

     所以我们想要实现swap函数,就需要使用传址调用,让swap函数可以通过地址间接操作main函数中的a和b,达到交换的效果。

void swap2(int* px, int* py)
{int temp = *px;*px = *py;*py = temp;
}
int main()
{int a = 10;int b = 20;printf("交换前:a=%d  b=%d\n", a, b);swap2(&a, &b);printf("交换前:a=%d  b=%d\n", a, b);
}

       通过传址调用,swap函数成功了,我们可以总结出以下结论:传址调用可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量,所以未来我们仅仅只是需要主调函数中的变量值来进行计算而不改变变量值,那么可以采用传值调用,如果函数内部要修改主调函数中变量的值,那么就需要传址调用。

 

相关文章:

【C语言】指针(1):入门理解篇

目录 一、内存和地址 1.1内存 1.2 深入理解计算机编址 二、指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解应用操作符 2.2.1 指针变量 2.2.2 解引用操作符 2.3指针变量的大小 三、指针变量类型的意义 3.1 指针的解引用 3.1指针-整数…...

经典双运算放大器LM358

前言 LM358双运放有几十年的历史了吧&#xff1f;通用运放&#xff0c;很常用&#xff0c;搞电路的避免不了接触运放&#xff0c;怎么选择运放&#xff0c;是工程师关心的问题吧&#xff1f; 从本文开始&#xff0c;将陆续发一些常用的运放&#xff0c;大家选型可以参考&#…...

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…...

vulnhub--IMF

环境 攻击机&#xff1a;192.168.96.4 靶机&#xff1a;ip未知 主机探测 确定靶机ip为32的主机 端口扫描 访问80端口 外围打点 在contact.php页面源码中找到了flag1 之后没啥突破 但查看网络后发现contact.php页面请求的三个js文件的文件名很有特点&#xff0c;猜测是base64编码…...

ePTFE膜(膨体聚四氟乙烯膜)应用前景广阔 本土企业技术水平不断提升

ePTFE膜&#xff08;膨体聚四氟乙烯膜&#xff09;应用前景广阔 本土企业技术水平不断提升 ePTFE膜全称为膨体聚四氟乙烯膜&#xff0c;指以膨体聚四氟乙烯&#xff08;ePTFE&#xff09;为原材料制成的薄膜。ePTFE膜具有耐化学腐蚀、防水透气性好、耐候性佳、耐磨、抗撕裂等优…...

C++与C#创建位图,是否需要区分RGB和BGR模式

在处理位图时&#xff0c;确实需要区分RGB和BGR模式&#xff0c;因为不同的库和API对颜色通道的排序有不同的约定。具体到C与C#&#xff0c;这一点也是需要注意的。 C 创建位图 使用GDI或WIC (Windows Imaging Component): 当你在C中使用这些Windows API创建或操作位图时&…...

web学习笔记(八十)

目录 1.小程序实现微信一键登录 2. 小程序的授权流程 3.小程序配置vant库 4.小程序配置分包 5.小程序配置独立分包 6.小程序分包预下载 1.小程序实现微信一键登录 要先实现小程序一键登录首先我们需要给按钮设置一个绑定事件&#xff0c;然后在绑定事件内部通过wx.login…...

深度解析 Raft 分布式一致性协议

本文参考转载至&#xff1a;浅谈 Raft 分布式一致性协议&#xff5c;图解 Raft - 白泽来了 - 博客园 (cnblogs.com) 深度解析 Raft 分布式一致性协议 - 掘金 (juejin.cn) raft-zh_cn/raft-zh_cn.md at master maemual/raft-zh_cn (github.com) 本篇文章将模拟一个KV数据读写服…...

Android10以上实现获取设备序列号功能

Android10以上实现获取设备唯一标识&#xff0c;目前只支持华为和荣耀设备。实现原理&#xff1a;通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…...

从0到1:培训老师预约小程序开发笔记二

背景调研 培训老师预约小程序&#xff1a; 教师和学生可以更便捷地安排课程&#xff0c;并提升教学质量和学习效果&#xff0c;使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间&#xff0c;学员可以根据老师的日程安排选择合适的时间进行预…...

【FFmpeg】av_read_frame函数

目录 1.av_read_frame1.2 从pkt buffer中读取帧&#xff08;avpriv_packet_list_get&#xff09;1.3 从流当中读取帧&#xff08;read_frame_internal&#xff09;1.3.1 读取帧&#xff08;ff_read_packet&#xff09;1.3.2 解析packet&#xff08;parse_packet&#xff09;1.3…...

女生学计算机好不好?感觉计算机分有点高……?

众所周知&#xff0c;在国内的高校里&#xff0c;计算机专业的女生是非常少的&#xff0c;很多小班30人左右&#xff0c;但是每个班女生人数只有个位数。这就给很多人一个感觉&#xff0c;是不是女生天生就不适合学这个东西呢&#xff1f;女生是不是也应该放弃呢&#xff1f;当…...

windows10/11 如何开启卓越性能模式

在Windows 10和Windows 11中&#xff0c;可以通过以下步骤启用“卓越性能”模式。请注意&#xff0c;卓越性能模式仅在Windows 10 Pro for Workstations和Windows 10 Enterprise版本中可用。 使用命令提示符启用卓越性能模式 打开命令提示符&#xff1a; 按Win X键&#xff0…...

JSP WEB开发(二) JavaBean

目录 JavaBean JavaBean特征 JavaBean的标签 JavaBean 的范围 标签 JavaBean JavaBean 是一种符合某些命名和设计规范的 Java 类&#xff0c;它是一种可重用组件技术&#xff0c;主要用于封装数据&#xff0c;执行负责的计算任务&#xff0c;封装事务逻辑等。JavaBean 的实…...

G2.【C语言】EasyX绘制颜色窗口

1.窗口 窗口&#xff1a;宽度*高度&#xff08;单位都是像素&#xff09; #include <stdio.h> #include <easyx.h> int main() {initgraph(640, 480);getchar();return 0; } 640是宽&#xff0c;480是高 2.操作窗口的三个按钮 #include <stdio.h> #incl…...

异构计算技术与DTK异构开发套件

异构计算技术与DTK异构开发套件 费林分类法&#xff1a;SISD SIMD MISD MIMD 指令流I和数据流D MIMD不同存储结构&#xff1a; UMA均匀存储访问模型NUMA非均匀存储访问模型Cluster集群 现在以Cluster为主 DTK异构开发套件 生态结构 异构并行编程模型是什么 HIP&#xff…...

数据结构之“栈”(全方位认识)

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 栈是一种数据结构&#xff0c;具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲&#xff01;&#xff01; …...

vue项目打包部署后 浏览器自动清除缓存问题(解决方法)

vue打包部署后 浏览器缓存问题&#xff0c;导致控制台报错ChunkLoadError: Loading chunk failed的解决方案 一、报错如下&#xff1a; 每次build打包部署到服务器上时&#xff0c;偶尔会出现前端资源文件不能及时更新到最新&#xff0c;浏览器存在缓存问题&#xff0c;这时在…...

解决vscode配置C++编译带有中文名称报错问题

在新电脑上安装vscode运行带有中文路径和中文名称的C代码时遇到报错 根据别人的教程将laugh.json文件中"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",改成了"program": "${fileDirname}\\output\\test.exe",&#x…...

A61 STM32_HAL库函数 之 TIM扩展驱动 -- C -- 所有函数的介绍及使用

A61 STM32_HAL库函数 之 TIM扩展驱动 -- C -- 所有函数的介绍及使用 1 该驱动函数预览1.24 HAL_TIMEx_OnePulseN_Stop1.25 HAL_TIMEx_OnePulseN_Start_IT1.26 HAL_TIMEx_OnePulseN_Stop_IT1.27 HAL_TIMEx_ConfigCommutationEvent1.28 HAL_TIMEx_ConfigCommutationEvent_IT1.29 …...

使用瀚高数据库开发管理工具进行数据的备份与恢复---国产瀚高数据库工作笔记008

使用瀚高数据库,备份 恢复数据 然后找到对应的目录 其实就是hgdbdeveloper,瀚高的数据库开发管理工具 对应的包中有个dbclient 这个目录,选中这个目录以后,就可以了,然后 在对应的数据库,比如 data_middle 中,选中 某个模式,比如bigdata_huiju 然后右键进行,点击 恢复,然…...

css 选择器汇总

目录 所有选择器伪类选择器 所有选择器 选择器用法id选择器#myid类选择器.myclassname标签选择器div,h1,p相邻选择器h1p子选择器ul > li后代选择器li a通配符选择器*属性选择器a[rel“external”]伪类选择器a:hover, li:nth-child 伪类选择器 在CSS3中新增了一个结构伪类选…...

My Greedy Algorithm(贪心算法)之路(一)

引子&#xff1a;我们之前&#xff0c;其实也遇到过贪心算法&#xff0c;0,1背包就是一个典型的贪心算法问题&#xff0c;那今天我就来开始my-Greedy Algorithm的道路。 什么是贪心算法&#xff1f; 我愿称贪心算法为贪婪鼠目寸光&#xff0c;贪心算法&#xff08;Greedy Alg…...

Win11 Python3.10 安装pytorch3d

0&#xff0c;背景 Python3.10、cuda 11.7、pytorch 2.0.1 阅读【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程-CSDN博客 1&#xff0c;解决方法 本来想尝试&#xff0c;结果发现CUB安装配置对照表里没有cuda 11.7对应的版本&#xff0c;不敢轻举妄动&#x…...

kotlin 中 string array 怎么表示

在 Kotlin 中&#xff0c;字符串数组可以使用 Array<String> 类型表示。你可以通过多种方式来创建和初始化字符串数组。以下是几种常见的方法&#xff1a; 使用 arrayOf 函数&#xff1a; val stringArray arrayOf("Hello", "World", "Kotli…...

ffmpeg使用bmp编码器把bgr24编码为bmp图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 不使用AVOutputFormat code void CFfmpegOps::EncodeBGR24ToBMP(const char* infile, const char* width_str, const char* height_str…...

基于YOLOv10+YOLOP+PYQT的可视化系统,实现多类别目标检测+可行驶区域分割+车道线分割【附代码】

文章目录 前言视频效果必要环境一、代码结构1、 训练参数解析2、 核心代码解析1.初始化Detector类2. torch.no_grad()3. 复制输入图像并初始化计数器4. 调用YOLOv10模型进行目标检测5. 提取检测结果信息6. 遍历检测结果并在图像上绘制边界框和标签7. 准备输入图像以适应End-to-…...

计算机网络之令牌总线

上文内容&#xff1a;什么是以太网 1.令牌总线工作原理 在总线的基础上&#xff0c;通过在网络结点之间有序地传递令牌来分配各结点对共享型总线的访问权利&#xff0c;形成闭合的逻辑环路。 完全采用半双工的操作方式&#xff0c;只有获得令牌的结点才能发送信息&#xff…...

策略模式的应用

前言 系统有一个需求就是采购员审批注册供应商的信息时&#xff0c;会生成一个供应商的账号&#xff0c;此时需要发送供应商的账号信息&#xff08;账号、密码&#xff09;到注册填写的邮箱中&#xff0c;通知供应商账号信息&#xff0c;当时很快就写好了一个工具类&#xff0…...

如何使用uer做多分类任务

如何使用uer做多分类任务 语料集下载 找到这里点击即可 里面是这有json文件的 因此我们对此要做一些处理&#xff0c;将其转为tsv格式 # -*- coding: utf-8 -*- import json import csv import chardet# 检测文件编码 def detect_encoding(file_path):with open(file_path,…...

【HICE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通...

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…...

绝区贰--及时优化降低 LLM 成本和延迟

前言 大型语言模型 (LLM) 为各行各业带来了变革性功能&#xff0c;让用户能够利用尖端的自然语言处理技术处理各种应用。然而&#xff0c;这些强大的 AI 系统的便利性是有代价的 — 确实如此。随着 LLM 变得越来越普及&#xff0c;其计算成本和延迟可能会迅速增加&#xff0c;…...

JDBC【封装工具类、SQL注入问题】

day54 JDBC 封装工具类01 创建配置文件 DBConfig.properties driverNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/qnz01?characterEncodingutf8&serverTimezoneUTC usernameroot passwordroot新建配置文件&#xff0c;不用写后缀名 创建工具类 将变…...

Windows打开redis以及Springboot整合redis

目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis&#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…...

MySQL使用LIKE索引是否失效的验证

1、简单的示例展示 在MySQL中&#xff0c;LIKE查询可以通过一些方法来使得LIKE查询能够使用索引。以下是一些可以使用的方法&#xff1a; 使用前导通配符&#xff08;%&#xff09;&#xff0c;但确保它紧跟着一个固定的字符。 避免使用后置通配符&#xff08;%&#xff09;&…...

封装日历uniapp,只显示年月不显示日

默认展示最新日期 子组件 <template><view class"date-picker"><picker mode"date" fields"month" change"onDateChange" :value"selectedDate"><view class"picker">{{ selectedDate…...

golang线程池ants-实现架构

1、总体架构 ants协程池&#xff0c;在使用上有多种方式(使用方式参考这篇文章&#xff1a;golang线程池ants-四种使用方法)&#xff0c;但是在实现的核心就一个&#xff0c;如下架构图&#xff1a; 总的来说&#xff0c;就是三个数据结构&#xff1a; Pool、WorkerStack、goW…...

Mysql面试合集

概念 是一个开源的关系型数据库。 数据库事务及其特性 事务&#xff1a;是一系列的数据库操作&#xff0c;是数据库应用的基本逻辑单位。 事务特性&#xff1a; &#xff08;1&#xff09;原子性&#xff1a;即不可分割性&#xff0c;事务要么全部被执行&#xff0c;要么就…...

Android Gradle 开发与应用 (五): 构建变体与自定义任务

目录 1. 概述 2. 构建变体 2.1 构建变体的概念 2.2 构建类型 2.3 产品风味 2.4 构建变体的使用 3. 自定义任务 3.1 自定义任务的概念 3.2 创建自定义任务 3.3 配置任务依赖 3.4 任务类型 3.5 动态任务 3.6 自定义任务执行顺序 4. 案例 4.1 多渠道打包 4.2 自动…...

Django学习第六天

启动项目命令 python manage.py runserver 取消模态框功能 js实现列表数据删除 第二种实现思路 使用jquery修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时&#xff1a;对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…...

docker部署mycat,连接上面一篇的一主二从mysql

一、docker下载mycat镜像 查看安装结果 这个名称太长&#xff0c;在安装容器时不方便操作&#xff0c;设置标签为mycat docker tag longhronshens/mycat-docker mycat 二、安装容器 先安装一个&#xff0c;主要目的是获得配置文件 docker run -it -d --name mycat -p 8066:…...

VUE2拖拽组件:vue-draggable-resizable-gorkys

vue-draggable-resizable-gorkys组件基于vue-draggable-resizable进行二次开发, 用于可调整大小和可拖动元素的组件并支持冲突检测、元素吸附、元素对齐、辅助线 安装: npm install --save vue-draggable-resizable-gorkys 全局引用: import Vue from vue import vdr fro…...

容器:stack

以下是关于stack容器的一些总结&#xff1a; stack容器比较简单&#xff0c;主要包括&#xff1a; 1、构造函数&#xff1a;stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素&#xff1a;top() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#x…...

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3

没有Microsoft在其办公解决方案中提供的界面&#xff0c;就无法想象现代应用程序&#xff0c;这个概念称为Ribbon UI&#xff0c;目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件&#xff0c;QtitanRibb…...

(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析

目录 前言1. DataFrame 简介2. DataFrame的特点3. DataFrame的创建3.1 使用字典创建DataFrame3.2 使用列表的列表&#xff08;或元组&#xff09;创建DataFrame3.3 使用NumPy数组创建DataFrame3.4 使用Series构成的字典创建DataFrame3.5 使用字典构成的字典创建DataFrame 4. 从…...

在 Azure 云中开始使用适用于 Ubuntu 的 Grafana

介绍 Grafana 是一款开源工具&#xff0c;可用于可视化和分析数据。它特别适合跟踪计算机系统的运行情况。在构建微服务或其他类型的应用程序时&#xff0c;您可能需要分析日志数据、轻松可视化数据或设置特殊警报以接收有关系统中发生的某些事件的通知。 这就是为什么你可能…...

1.Python学习笔记

一、环境配置 1.Python解释器 把程序员用编程语言编写的程序&#xff0c;翻译成计算机可以执行的机器语言 安装&#xff1a; 双击Python3.7.0-选择自定义安装【Customize installation】-勾选配置环境变量 如果没有勾选配置环境变量&#xff0c;输入python就会提示找不到命令…...

中英双语介绍百老汇著名歌剧:《猫》(Cats)和《剧院魅影》(The Phantom of the Opera)

中文版 百老汇著名歌剧 百老汇&#xff08;Broadway&#xff09;是世界著名的剧院区&#xff0c;位于美国纽约市曼哈顿。这里汇集了许多著名的音乐剧和歌剧&#xff0c;吸引了全球各地的观众。以下是两部百老汇的经典音乐剧&#xff1a;《猫》和《剧院魅影》的详细介绍。 1.…...

RpcChannel的调用过程

目录 1. RPC调用方&#xff08;caller&#xff09;的调用(消费)过程 2.在caller下创建文件&#xff1a;calluserservice.cc 3.在src的include下创建文件&#xff1a;mprpcchannel.h 4.在src下创建mprpcchannel.cc 1. RPC调用方&#xff08;caller&#xff09;的调用(消费)过…...