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

C/C++指针

 为什么要使用指针

        函数的值传递,无法通过调用函数,来修改函数的实参;被调用函数需要提供更多的“返回值”给调用函数;减少值传递时带来的额外开销,提高代码执行效率

指针定义:指针是什么

int age=18;
/* 定义了一个指针,指针本身也是一个变量,名称是 p, 
它是一个指针,可以指向一个整数。
也就是说: p 的值就是一个整数的地址!!!    */
int *p ;
//指针 p 指向了 age,p 的值,就是 age 的地址
p = &age;

指针的定义

int *p; // int *p1, *p2; 
int* p; // int* p1,p2; //p1 是指针, p2 只是整形变量
int * p;
int*p;    //不建议

指针的初始化、访问

指针的初始化

int room = 2;
//定义两个指针变量指向 room
int *p1 = &room;
int *p2 = &room;
printf("room 地址:%p\n", &room);
printf("p1 地址:%p\n", &p1);
printf("room 所占字节:%d\n", sizeof(room));
printf("p1 所占字节:%d\n", sizeof(p1));

注意: 32 位系统中,int 整数占 4 个字节,指针同样占 4 个字节。64 位系统中,int 整数占 4 个字节,指针占 8 个字节

%p、0x%x、0x%X//使用 16 进制打印,把地址值当成一个无符号数来处理。

指针的访问

int room = 2 ;
int * girl = &room;
int x = 0;
x = *girl;
// & 是取地址符
// *是一个特殊的运算符,*girl 表示读取指针 girl 所指向的
//变量的值, *girl 相当于 room

空指针和野指针

空指针:就是值为 0 的指针。(任何程序数据都不会存储在地址为 0 的内存块中,它是被操作系

统预留的内存块。)

指针初始化为空指针: int *p = 0; 或者  int *p = NULL; //强烈推荐,目的就是,避免访问非法数据

指针不再使用时,可以设置为空指针。

int *select = &xiao_long_lv;
//和小龙女约会
select = NULL;

表示这个指针还没有具体的指向,使用前进行合法性判断

int *p = NULL;
// 。。。。
if (p) { //p 等同于 p!=NULL
//指针不为空,对指针进行操作
}

野指针指:指向无效内存地址的指针,通常是由于指针未被初始化、指向已释放的内存,或越界访问导致的。

//情形一 没有初始化
int *select; //情形二 内存不确定
select = 100;
printf("选择的房间是: %d\n", *select); 

const修饰使用:渣值暖超 

#include <stdio.h>
#include <stdlib.h>
//const 和指针int main(void){int wife = 24;int girl = 18;//第一种 渣男型int * zha_nan = &wife;*zha_nan = 25;zha_nan = &girl;*zha_nan = 19;printf("girl : %d,wife: %d\n", girl, wife);//第二种 直男型 不能修改指向变量的值//const int * zhi_nan = &wife; //第一种写法int const * zhi_nan = &wife;   // 第二种写法*zhi_nan = 26;printf("直男老婆的年龄:%d\n", *zhi_nan);zhi_nan = &girl;printf("直男女朋友的年龄:%d\n", *zhi_nan);//*zhi_nan = 20;//第三种 暖男型 不允许指向别的地址int * const nuan_nan = &wife;*nuan_nan = 26;printf("暖男老婆的年龄:%d\n", wife);//nuan_nan = &girl;//第四种超级暖男型 不允许指向别的地址,不能修改指向变量的值const int * const super_nuan_nan = &wife;//*super_nuan_nan = 28;//super_nuan_nan = &girl;system("pause");return 0;
}

总结: 看 const 离类型(int)近,还是离指针变量名近,离谁近,就修饰谁,谁就不能变

指针的算术运算

指针自增运算

p++ 是在 p 当前地址的基础上 ,自增 p 对应类型的大小,也就是说 p = p+ 1*(sizeof(类型))

指针自减运算

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*
* 让用户输入一个字符串,然后反向输出,注意:不能改变原来的字符串!
* 如: "12345" 逆转成
"54321" 输出
*/int main(void)
{char input[128];int len;char tmp;scanf_s("%s", input, 128);len = strlen(input);//方法 1 交换/* for( int i=0; i<len/2; i++){tmp = input[i];input[i] = input[len-i-1];input[len-i-1] = tmp;}*//*for(int i=0; i<len; i++){printf("%c", input[i]);}*///printf("逆转后:%s\n", input);//第二种方法/*for(int i=0; i<len; i++){printf("%c", input[len-i-1]);}printf("\n");*///第三种方法char *p = &input[len-1];for(int i=0; i<len; i++){printf("%c", *p--);}printf("\n");system("pause");return 0;
}

指针与整数之间的加减运算

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(void){int ages[] = {20,18,19,24,23,28,30,38, 35, 32};int len = sizeof(ages) / sizeof(ages[0]);int *p = ages;printf("第 7 个的年龄: %d\n", *(p+6));//30printf("*p+6 = : %d\n", *p+6);//26printf("第 3 个的年龄: %d\n", *(p+2));int *p1 = &ages[4];printf("相对于第 5 个,她的前一位的年龄: %d\n", *(p1 -1));printf("相对于第 5 个,她的前三位的年龄: %d\n", *(p1 -3));system("pause");return 0;
}

指针与整数的运算,指针加减数字表示的意义是指针在数组中位置的移动;对于整数部分而言,它代表的是一个元素,对于不同的数据类型,其数组的元素占用的字节是不一样的,比如指针 + 1,并不是在指针地址的基础之上加 1 个地址,而是在这个指针地址的基础上加 1 个元素占用的字节数:如果指针的类型是 char*,那么这个时候 1 代表 1 个字节地址;如果指针的类型是 int*,那么这个时候 1 代表 4 个字节地址;如果指针的类型是 float*,那么这个时候 1 代表 4 个字节地址;如果指针的类型是 double*,那么这个时候 1 代表 8 个字节地址。

通用公式: 数据类型 *p;p + n 实际指向的地址:p 基地址 + n * sizeof(数据类型);p - n 实际指向的地址:p 基地址 - n * sizeof(数据类型)

比如:对于 int 类型,比如 p 指向 0x0061FF14,则:p+1 实际指向的是 0x0061FF18,与 p 指向的内存地址相差 4 个字节;p+2 实际指向的是 0x0061FF1C,与 p 指向的内存地址相差 8 个字节

对于 char 类型,比如 p 指向 0x0061FF28,则:p+1 实际指向的是 0x0061FF29,与 p 指向的内存地址相差 1 个字节;p+1 实际指向的是 0x0061FF2A,与 p 指向的内存地址相差 2 个字节;

指针与指针之间的加减运算

知识点:指针和指针可以做减法操作,但不适合做加法运算;指针和指针做减法适用的场合:两个指针都指向同一个数组,相减结果为两个指针之间的元素数目,而不是两个指针之间相差的字节数。

//比如:
int int_array[4] = {12, 34, 56, 78};
int *p_int1 = &int_array[0];
int *p_int2 = &int_array[3];
//p_int2 - p_int1 的结果为 3,即是两个之间之间的元素数目为 3 个。

如果两个指针不是指向同一个数组,它们相减就没有意义。不同类型的指针不允许相减,比如

char *p1;int *p2;p2-p1 是没有意义的。

二级指针

二级指针也是一个普通的指针变量,只是它里面保存的值是另外一个一级指针的地址

定义:

int guizi1 = 888;//1 级指针,保存 guizi1 的地址
int *guizi2 = &guizi1; //2 级指针,保存 guizi2 的地址,guizi2 本身是一个一级指针变量
int **liujian = &guizi2; 

二级指针的用途:

1. 普通指针可以将变量通过参数“带入”函数内部,但没办法将内部变量“带出”函数

2. 二级指针可以不但可以将变量通过参数函数内部,也可以将函数内部变量 “带出”到函数外部。

#include <stdio.h>
#include <stdlib.h>void swap(int *a, int *b){int tmp =*a;*a= *b;*b= tmp;
}void boy_home(int **meipo){static int boy = 23;*meipo = &boy;
}int main(void){//int x=10, y=100;//swap(&x, &y);//printf("x=%d, y=%d\n", x, y);int *meipo = NULL;boy_home(&meipo);printf("boy: %d\n", *meipo);system("pause");return 0;
}

多级指针的定义、使用

可以定义多级指针指向次一级指针

//比如:
int guizi1 = 888;
int *guizi2 = &guizi1;
//普通指针int **guizi3 = &guizi2;
//二级指向一级int ***guizi4 = &guizi3;
//三级指向二级int ****guizi5 = &guizi4; //四级指向三级
//         有完没完。。。

指针和数组的纠缠

1. 指针表示法和数组表示法

数组完全可以使用指针来访问, days[3] 和 *(days+3) 等同

2. 存储指针的数组[指针数组]

定义: 类型 *指针数组名[元素个数] ;

int *qishou[2];        //定义一个有两个元素的指针数组,每个元素都是一个指针变量

指针和二维数组

1. 指向数组的指针【数组指针】

int (*p)[3]; //定义一个指向三个成员的数组的指针

访问元素的两种方式:数组法:(*p)[j]、指针法:*((*p)+j)

2. 使用普通指针访问二维数组

A[0] 的含义A 是一个二维数组,A[0] 表示它的第 0 行(即 A[0][0]A[0][1]A[0][2])。在 C/C++ 中,A[0] 会被隐式转换为 &A[0][0],即第 0 行的首地址(也就是 A[0][0] 的地址)。&A[0][0] 的含义:直接取 A[0][0] 的地址,显然也是指向二维数组的第一个元素。

数组与指针的区别

数组:数组是用于储存多个相同类型数据的集合。

指针:指针是一个变量,但是它和普通变量不一样,它存放的是其它变量在内存中的地址。

1. 赋值

数组:只能一个一个元素的赋值或拷贝

指针:指针变量可以相互赋值

2. 表示范围

数组有效范围就是其空间的范围,数组名使用下表引用元素,不能指向别的数组

指针可以指向任何地址,但是不能随意访问,必须依附在变量有效范围之内

3. sizeof

数组:

数组所占存储空间的内存:sizeof(数组名)

数组的大小:sizeof(数组名)/sizeof(数据类型)

指针:

在 32 位平台下,无论指针的类型是什么,sizeof(指针名)都是 4.

在 64 位平台下,无论指针的类型是什么,sizeof(指针名)都是 8.

4. 指针数组和数组指针

针指数组:

int *qishou[2];//定义一个有两个元素的指针数组,每个元素都是一个指针变量

int girl1= 167;

int girl2 = 171;

qishou[0] = &girl1;

qishou[1] = &girl2;

数组指针:

int (*p)[3]; //定义一个指向三个成员的数组的指针

访问元素的两种方式:

int A[4][3]={{173, 158, 166},

{168, 155, 171},

{163, 164, 165},

{163, 164, 172}};

p = &A[0];

数组法: (*p)[j]

指针法: *((*p)+j)

5. 传参

数组传参时,会退化为指针!

(1)退化的意义:C 语言只会以值拷贝的方式传递参数,参数传递时,如果只拷贝整个数

组,效率会大大降低,并且在参数位于栈上,太大的数组拷贝将会导致栈溢出。

(2)因此,C 语言将数组的传参进行了退化。将整个数组拷贝一份传入函数时,将数组名

看做常量指针,传数组首元素的地址。

#include <stdio.h>
#include <stdlib.h>
/*------------------ <一维数组传参> -----------------------*/
/*方式一: 形参不指定数组大小
用数组的形式传递参数,不需要指定参数的大小,
因为在一维数组传参时,形参不会真实的创建数组,
传的只是数组首元素的地址。
*/
void method_1(int arr[], int len)
{for(int i=0; i<len; i++){printf(" arr[%d] = %d\n", i, arr[i]);}
}//方式二:指定数组大小
void method_2(int arr[10])
{for(int i=0; i<10; i++){printf(" arr[%d] = %d\n", i, arr[i]);}
}//方式三: 一维数组传参退化,用指针进行接收,传的是数组首元素的地址
void method_3(int *arr, int len){for(int i=0; i<len; i++){printf(" arr[%d] = %d\n", i, arr[i]);}
}int main(){int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};method_1(arr, 10);printf("------华丽的分隔线------\n");method_2(arr);printf("------华丽的分隔线------\n");method_3(arr, 10);system("pause");return 0;
}

#include <stdio.h>
#include <stdlib.h>/*-------------------- <指针数组传参> -----------------------*/
//方式一: 指针数组传参,声明成指针数组,不指定数组大小
void method_4(int *arr[], int len){for(int i=0; i<len; i++){printf(" arr[%d] = %d\n", i, *arr[i]);}
}//方式二: 指针数组传参,声明成指针数组,指定数组大小
void method_5(int *arr[10]){for(int i=0; i<10; i++){printf(" arr[%d] = %d\n", i, *arr[i]);}
}//方式三: 二维指针传参
//传过去是指针数组的数组名,代表首元素地址,而数组的首元素又是一个指针,
//就表示二级指针,用二级指针接收
void method_6(int **arr, int len){for(int i=0; i<len; i++){printf(" arr[%d] = %d\n", i, *(*(arr+i)));}
}int main(){int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int *arr_p[10] = {0};for(int i=0; i<10; i++){arr_p[i] = &arr[i];}method_4(arr_p, 10);printf("------华丽的分隔线------\n");method_5(arr_p);printf("------华丽的分隔线------\n");method_6(arr_p, 10);system("pause");return 0;
}

void 类型指针

void => 空类型        void* => 空类型指针,只存储地址的值,丢失类型,无法访问,要访问其值,我们必须对这个指针做出正确的类型转换,然后再间接引用指针。所有其它类型的指针都可以隐式自动转换成 void 类型指针,反之需要强制转换。

#include <stdio.h>
#include <stdlib.h>int main(void){int arr[]={1, 2, 3, 4, 5};char ch = 'a';void *p = arr;//定义了一个void 类型的指针//p++; //不可以,void * 指针不允许进行算术运算p = &ch; //其它类型可以自动转换成void * 指针//printf("数组第一个元素: %d\n", *p); //不可以进行访问printf("p: 0x%p ch: 0x%p\n", p, &ch);char * p1 = (char *)p;    //强制类型转化printf("p1 指向的字符是: %c\n", *p1);system("pause");return 0;
}

 函数指针

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int compare_int(const void *a, const void *b){//printf("调用compare_int 啦,你好骚气哦! \n");int *a1 = (int *) a;int *b1 = (int *) b;//printf("a 的地址: 0x%p b的地址: 0x%p\n", &a, &b);return *b1 - *a1;
}int compare_char(const void *a, const void *b){//printf("调用compare_char 啦,你好骚气哦! \n");char c1 = *((char *) a);char c2 = *((char *) b);if(c1>='A' && c1<='Z') c1+=32;if(c2>='A' && c2<='Z') c1+=32;return c1 - c2;
}int main(void){int x = 10;int y = 20;//函数有没有地址?//printf("compare_int 的地址: 0x%p \n", &compare_int);//compare_int(&x, &y);//函数指针的定义 把函数声明移过来,把函数名改成 (* 函数指针名)int (*fp)(const void *, const void *);/*贝尔实验室的C和UNIX的开发者采用第1种形式,而伯克利的UNIX推广者却采用第2种形式ANSI C 兼容了两种方式*/fp = &compare_int; //(*fp)(&x, &y); //第1种,按普通指针解引的放式进行调用,(*fp) 等同于compare_intfp(&x, &y);        //第2种 直接调用//qsort 对整形数组排序int arr[]={2, 10, 30, 1, 11, 8, 7, 111, 520};qsort(arr, sizeof(arr)/sizeof(int), sizeof(int), &compare_int);for(int i=0; i<sizeof(arr)/sizeof(int); i++){printf(" %d", arr[i]);}//qsort 可以对任何类型的数组进行排序char arr1[]={"abcdefghiABCDEFGHI"};qsort(arr1, sizeof(arr1)/sizeof(char)-1, sizeof(char), &compare_char);for(int i=0; i<sizeof(arr1)/sizeof(char)-1; i++){printf(" %c", arr1[i]);}system("pause");return 0;
}

相关文章:

C/C++指针

为什么要使用指针 函数的值传递&#xff0c;无法通过调用函数&#xff0c;来修改函数的实参&#xff1b;被调用函数需要提供更多的“返回值”给调用函数&#xff1b;减少值传递时带来的额外开销&#xff0c;提高代码执行效率 指针定义&#xff1a;指针是什么 int age18; /* …...

Unity编辑器扩展之项目资源查找工具

一、需要实现的效果如下: 二、在项目的Asset目录下新增Editor目录,新增AssetSearchWindow和EditorDefine和EditorTools这三个C#脚本,并复制以下的代码保存好之后,就可以实现上述功能啦。 -------------------------------------------EditorTools脚本Begin----------------…...

什么是分布式锁?

分布式锁是一种在分布式系统中控制资源共享的机制。 一、背景和作用 在单机环境下&#xff0c;当多个线程同时访问共享资源时&#xff0c;可以通过线程锁&#xff08;如 Java 中的 synchronized 关键字、ReentrantLock 等&#xff09;来保证操作的原子性、可见性和有序性&#…...

ESP32- 开发笔记- 硬件设计-ESP32-C3 天线设计-利用嘉立创EDA来设计

这个硬件设计&#xff0c;只是一个随手记录文档。如果中间有什么问题&#xff0c;欢迎大家提出来。 1 板载天线 1.1 背景介绍 PCB&#xff08;Printed Circuit Board&#xff09;板载天线是现代电子设备中用于无线通信的一种关键组件&#xff0c;它直接集成在电路板上&#…...

setTimeoutsetIntervalrequestAnimationFrame

requestAnimationFrame 详解及与 setTimeout/setInterval 的比较 requestAnimationFrame&#xff08;简称 rAF&#xff09;是浏览器提供的专门用于 动画渲染 的 API&#xff0c;相比 setTimeout 和 setInterval&#xff0c;它在性能和流畅度上有显著优势。以下是详细解析和对比…...

Python内置函数---anext()

用于异步迭代器的核心工具&#xff0c;专为处理异步数据流设计。 1. 基本语法 await anext(async_iterator, default) 参数&#xff1a; async_iterator &#xff1a;实现了异步迭代协议的对象&#xff08;如异步生成器、异步迭代器类&#xff09;。 default &#xff08;可选…...

JavaEE——线程安全

目录 前言1.线程安全的定义2.线程安全问题产生的原因2.1 多个线程修改一个变量2.2 修改操作不是原子的2.3 内存可见性引起的线程安全问题 3.解决线程安全问题的方法3.1 通过synchronized关键字加锁3.2 使用volatile关键字 总结 前言 在使用多线程的时候&#xff0c;难免会出现…...

MongoServerError: Authentication failed.处理办法

1停止MongoDB服务&#xff1a; systemctl stop mongod2临时修改MongoDB配置&#xff0c;禁用认证&#xff1a; vim /etc/mongdb.config 在配置文件中找到 security:authorization: disabled # 临时关闭认证3.重启MongoDB服务 # 重启MongoDB服务 sudo systemctl restart mon…...

IOS微信小程序无法显示背景图片

最近线上突然出现了一个问题&#xff0c;就是原来的在线上的小程序无法显示背景图片。而且这个问题只有在IOS上才有。在安卓上是正常的。 然后这里和前端沟通说是&#xff0c;看能不能用苹果手机真机调试。果然也成功复现出来了&#xff0c;部分图片无法显示。 然后在网上找了…...

实验五 8255和LED数码管显示实验

一、实验目的 1&#xff0e;掌握并行接口8255A的工作原理及使用方法。 2&#xff0e;了解七段数码管显示数字的原理。 3&#xff0e;掌握多位数码显示的接口技术。 二、实验电路 三、实验内容 1&#xff0e;静态显示&#xff1a;按图3连接好电路&#xff0…...

秒杀系统解决两个核心问题的思路方法总结:1.库存超卖问题;2.用户重复抢购问题。

秒杀系统解决两个核心问题 秒杀系统解决两个核心问题&#xff1a;一、解决库存超卖的核心逻辑&#xff1a;解释&#xff1a;原子性保证&#xff1a; 二、如何避免重复抢购&#xff1a;使用 Redis 做唯一标识判断优点&#xff1a; 三、流程完整梳理&#xff1a;四、通过数据库建…...

大数吞小数

A-春_牛客练习赛134 double 的有效数字约 15-17 位十进制&#xff0c;因此&#xff1a; 如果两个数的数量级相差超过 15-16 个数量级&#xff0c;较小的数会被吞掉。...

1-9 堆宝塔

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于临时叠放。把第 1 块彩虹圈…...

Java虚拟机(JVM)平台无关?相关?

计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即&#xff0c;输入参数&#xff0c;根据程序计算&#xff0c;输出结果。图灵机模型如图。 Tape是输入数据&#xff0c;Program是针对这些数据进行计算的程序&#xff0c;中间横着的方块表示的是机器的状态。 目前使…...

第七章--查找

查找表 定义 由同一类型的数据元素(或记录)构成的集合。 1&#xff09;特点&#xff1a;数据元素的类型相同&#xff1b;结构松散→先后次序无关紧要&#xff0c;只关心是否在集合内。 2&#xff09;常用操作&#xff1a;查询某个“特定的”数据元素是否在查找表中&#xf…...

photo-sphere-viewer 4.8.1在vue中使用

photo-sphere-viewer 加载单张平面图 import { Viewer } from photo-sphere-viewerthis.viewer new Viewer({panorama: ‘完整的url,也可以是一个base64’,// Containercontainer: document.getElementById(viewer1),navbar: true,// Resize the panoramasize: {width: 100%,…...

vue MarkdownIt标签多出了<p>标签导致高度变丑

​ 效果如下&#xff1a; ​ [点击并拖拽以移动] ​ F12观察后发现多了 标签包裹&#xff0c;所以要解决 标签。 在 markdown-it 中禁用自动包裹 <p> 标签的方法 要让 markdown-it 渲染的 Markdown 内容不自动包裹 <p> 标签&#xff0c;你可以使用以下两种方…...

《Java 并发编程实践》阅读笔记(一):线程重要性

文章目录 一. 并发历史二. 线程优势三. 线程带来的风险1. 安全性问题2. 活跃性问题3. 性能问题 四. 线程无处不在示例1: Timer示例2: 远程方法调用(Remote Method Invocation, RMI)示例3: GUI 程序 一. 并发历史 操作系统的出现 大型机时代, 没有操作系统, 一台主机只能执行一…...

算法思想之分治-归并

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之分治-归并 发布时间&#xff1a;2025.4.17 隶属专栏&#xff1a;算法 目录 算法介绍核心思想与步骤时空复杂度分析C代码实现关键特性与优化 例题排序数组题目链接题目描述算法思路代码实现 交易逆序对的总…...

Vue基础(5)_事件修饰符

事件修饰符 Vue中的事件修饰符&#xff1a; 1、prevent&#xff1a;阻止默认事件(常用)。 2、stop&#xff1a;阻止事件冒泡(常用)。 3、once&#xff1a;事件只触发一次(常用)。 4、capture&#xff1a;使用事件的捕获模式。 5、self&#xff1a;只有event.target是当前操作的…...

网络编程 - 1

目录 为什么需要网络编程&#xff1f; —— 丰富的网络资源 什么是网络编程 网络编程中的基本概念 发送端和接收端 请求和相应 客户端和服务端 常见的客户端服务端模型 Socket 套接字 概念 分类 解释 有连接 / 无连接 可靠传输 / 不可靠传输 面向字节流 / 面向数…...

github | 仓库权限管理 | 开权限

省流版总结&#xff1a; github 给别人开权限&#xff1a;仓库 -> Setting -> Cllaborate -> Add people GitHub中 将公开仓库改为私有&#xff1a;仓库 -> Setting -> Danger Zone&#xff08;危险区&#xff09; ->Change repository visibility( 更改仓…...

【系统搭建】DPDK关键概念与l2fwd源码解析

DPDK&#xff08;Data Plane Development Kit&#xff09;是一套用于高性能网络数据面处理的开发框架&#xff0c;其核心设计在于绕过内核协议栈&#xff0c;它提供了一个用户空间下的高效数据包处理库函数&#xff0c;可以用于快速开发高性能的网络应用程序&#xff0c;如网络…...

【Qt】初识Qt(一)

目录 一、Qt的背景二、认识Qt项目 一、Qt的背景 关于客户端开发&#xff1a; 客户端开发的重要任务&#xff0c;是编写和用户交互的界面&#xff0c;和用户交互的界面有两种风格&#xff1a; TUI&#xff1a;命令行界面&#xff0c;也叫终端界面GUI&#xff1a;图形化界面 Q…...

Django REST framework 并结合 `mixin` 的示例

下面为你提供一个使用 Django REST framework 并结合 mixin 的示例,该示例将实现一个简单的图书管理 API。 项目需求 我们要创建一个图书管理系统的 API,支持对图书信息的创建、读取、更新和删除操作。 实现步骤 1. 项目初始化 首先,确保你已经安装了 Django 和 Django…...

《前端性能优化秘籍:打造极致用户体验》

在当下&#xff0c;网站和应用的性能表现直接关乎用户去留。快速加载、流畅交互的页面能让用户沉浸其中&#xff0c;反之&#xff0c;缓慢的响应速度则会让他们毫不犹豫地离开。对于前端开发者而言&#xff0c;性能优化不仅是技术追求&#xff0c;更是提升用户体验、增强产品竞…...

数据结构与算法学习导航

目录 指导思想资料总结代码随想录hello-algoOI-WIKI 一名麻瓜的刷leetcode的简单概述。 在这里对过去的自己说: 如果你相信算法有用你就刷刷leetcode&#xff0c;如果不相信面试会让你相信。 当然&#xff0c;现在我确实认为算法和数据结构有用&#xff0c;leetcode也有用。 …...

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…...

nginx中的代理缓存

1.缓存存放路径 对key取哈希值之后&#xff0c;设置cache内容&#xff0c;然后得到的哈希值的倒数第一位作为第一个子目录&#xff0c;倒数第三位和倒数第二位组成的字符串作为第二个子目录&#xff0c;如图。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值...

【深度学习】详解矩阵乘法、点积,内积,外积、哈达玛积极其应用|tensor系列02

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【深度学习】你真的理解张量了吗&#xff1f;|标量、向量、矩阵、张量的秩|01每日一言&#x1f33c;: “脑袋想不明白的&#xff0c;就用脚想”…...

20.3 使用技巧3

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 20.3.5 禁止追加行与禁止删除行 通常情况下DataGridView最末一行是空白行&#xff0c;在此行单元格输入数据就可以追加新行。如果需要…...

使用代理IP提取数据的步骤是什么?代理IP如何提高爬虫采集效率?

在当今大数据时代&#xff0c;网络爬虫已成为获取互联网信息的重要手段。然而&#xff0c;许多网站为了防止数据被过度抓取&#xff0c;会设置反爬机制&#xff0c;如IP封禁、访问频率限制等。这时&#xff0c;使用代理IP就成为了一种有效的解决方案。本文将详细介绍使用代理IP…...

探索关系型数据库 MySQL

目录 引言 一.SQL的基本操作 1.数据库是什么? 什么是SQL&#xff1f; 1.1.OLTP 1.2.OLAP 1.3.SQL 1.4.DQL 1.5.DML 1.6.DDL 1.7.DCL 1.8.TCL 1.9.数据库术语 2.MySQL体系结构 2.1.连接者 2.2.MySQL 内部连接池 2.3.管理服务和工具组件 2.4.SQL接口 …...

Redis--事务

目录 一、事务介绍 二、事务操作 2.1 MULTI 2.2 EXEC 2.3 DISCARD 2.4 WATCH 2.5 UNWATCH 一、事务介绍 Redis 的事务和 MySQL 的事务概念上是类似的. 都是把一系列操作绑定成⼀组. 让这⼀组能够批量执行. 但是注意体会 Redis 的事务和 MySQL 事务的区别: 1.弱化的原子性…...

【Windows上配置Git环境】

在Windows上配置Git环境可以按照以下步骤进行&#xff1a; 1. 下载Git 打开浏览器&#xff0c;访问Git官方网站https://git-scm.com/downloads。在下载页面中&#xff0c;找到适用于Windows的下载链接&#xff0c;根据你的系统是32位还是64位选择相应的安装包进行下载 。 2.…...

揭秘大数据 | 23、软件定义网络

软件定义网络将网络的边缘从硬件交换机推进到了服务器里面&#xff0c;将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员网络管理员的模式变成了纯系统管理员的模式&#xff0c;让服务器的业务部署变得简单&#xff0c;不再依赖于形态和功能各异的硬件交换机&#xf…...

前端api(请求后端)简易template

微信小程序 API 模块模板 基本 API 模块结构 /*** 示例API模块*/ const api require(../api); const config require(../../config/index);// 示例API对象 const exampleApi {// API方法定义... };// 导出模块 module.exports exampleApi;标准 RESTful 请求方法 获取列表…...

【力扣】重排链表

重排链表 代码 class Solution { public:void reorderList(ListNode* head) {//当链表只有一个节点或两个节点时直接返回空,不用重排if (head->next NULL || head->next->next NULL) return;//1. 进行分割链表ListNode* fast head, *slow head;ListNode* end1 N…...

选 Hibernate 还是 MyBatis?全方位差异解读

Hibernate 和 MyBatis 都是 Java 开发中用于处理数据库操作的持久化框架&#xff0c;不过它们在实现技术上存在诸多差异&#xff0c;下面从多个方面进行对比&#xff1a; 1. 映射机制 Hibernate&#xff1a;采用全自动的对象关系映射&#xff08;ORM&#xff09;机制&#xf…...

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …...

类和对象(下篇)(详解)

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…...

win10下github libiec61850库编译调试sntp_example

libiec61850 https://github.com/mz-automation/libiec61850 v1.6 简介 libiec61850 是一个开源&#xff08;GPLv3&#xff09;的 IEC 61850 客户端和服务器库实现&#xff0c;支持 MMS、GOOSE 和 SV 协议。它使用 C 语言&#xff08;根据 C99 标准&#xff09;实现&#xf…...

【HDFS入门】HDFS高可用性与容错机制深度解析

目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…...

Qt QML实现Windows桌面歌词动态播放效果

前言 使用Qt5.15.2&#xff0c;QML实现简单的歌词动态播放效果。 效果图如下&#xff1a; 注&#xff1a;这里只是为了演示播放效果&#xff0c;并未真正加载音频进行播放。可以在此基础上进行扩展。 正文 关键代码 QML部分 import QtQuick 2.15 import QtQuick.Window 2.…...

Qt GUI 库总结

Qt GUI 库总结 Qt GUI 库&#xff08;QtGui&#xff09;是 Qt 框架中负责图形用户界面&#xff08;GUI&#xff09;开发的核心模块。本文将一步步详解 QtGui&#xff0c;从基础入门到高级应用&#xff0c;帮助你全面掌握其功能。以下内容包括环境配置、基本功能、核心特性及进…...

[dp16_两个数组] 通配符匹配 | 交错字符串 | 两个字符串的最小ASCII删除和

目录 1.通配符匹配 题解 2.交错字符串 题解 3.两个字符串的最小ASCII删除和 1.通配符匹配 链接&#xff1a;44. 通配符匹配 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字…...

记录一次生产中mysql主备延迟问题处理

登录库&#xff1a; mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行&#xff1a;show slave status\G 查看 seconds_Behind_Master&#xff0c;延迟 2705s&#xff0c;而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...

【计算机视觉】OpenCV实战项目-AdvancedLaneDetection 车道检测

AdvancedLaneDetection 项目解析 项目概述项目结构功能和步骤依赖项使用方法项目特点改进建议结论运行项目1. 克隆项目仓库2. 安装依赖项创建虚拟环境&#xff08;可选&#xff09;激活虚拟环境安装依赖项 3. 准备数据4. 运行项目5. 调整配置&#xff08;可选&#xff09;6. 查…...

趣味编程之分布式系统:负载均衡的“雨露均沾“艺术

#此篇文章由Deepseek大力支持&#x1f60b; 凌晨三点&#xff0c;西二旗某火锅店后厨—— “羊肉卷走3号桌&#xff01;” “肥牛卷去7号&#xff01;” “虾滑优先给VIP区&#xff01;” 我蹲在传菜口的监控屏幕前&#xff0c;看着机器人服务生们忙而不乱地穿梭。突然间&am…...

移植firefly core-1126-jd4官方sdk源码到其他rv1126板卡时 kernel启动中失去响应问题解决

问题背景 在项目中采用firefly core-1126-jd4的sdk适配其他rv1126板卡遇到kernel启动中无响应。串口能看到运行到usb、mmc等模块驱动流程&#xff0c;但之后就打印&#xff0c;通过追加打印确认usb、mmc模块的init已经执行完&#xff0c;怀疑是执行其他某个静态编译进kernel的…...