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

C语言-3

定义指针

/*指针的概念:1.为了方便访问内存中的内容,给每一个内存单元,进行编号,那么我们称这个编号为地址,也就是指针。2.指针也是一种数据类型,指针变量有自己的内存,里面存储的是地址,也就是那些编号。四要素1.指针本身的类型    例如:float*    int*    ...2.指针指向的类型    例如:float        int        ...3.指针本身的内存4.指针指向的内存运算符*:1.定义指针时,通过 * 符号,来表示定义的是一个指针,并且是指针自身的类型的组成部分2.其他时候,表示解析引用(取内容:通过内存编号,读取内存中的内容)&:取(首)地址符,作用:取出(内存的)首地址
*/# include <stdio.h>int main()
{// 定义指针(指针:pointer)float* p_name;    // 指针本身的类型:float*    指针指向的类型:floatint * p1;int *p2;        // * 符号偏不偏移不影响其功能return 0;
}

指针初始化与赋值

/*知识储备:// 初识化:定义的同时,给值int a = 0;// 赋值:先定义,再给值int b;b = 0;
*/# include <stdio.h>int main()
{    // 初始化int num = 6;int val = 8;// 初始化int* p1 = &num;    // 对于指针变量p1,如果进行给值,必须给地址(内存编号)// 赋值int* p2;p2 = &val;// 自行体会int* p3 = p1;// 直接存入地址(不推荐使用,因为你不知道自己随便写的地址里面是什么!!)int* p4 = (int*)123456;    // 将 整型123456 强转为 int*类型 的“地址”int* p5 = (int*)0XAB25;    // 计算机中的内存地址通常用16进制数表示// 直接使用地址:置空(即:"使用0地址,NULL:0X0")int* p6 = NULL;    // 等价于 int* p6 = (int*)0X0;// 目的:为了给暂无指向的指针,提供指向,保证安全,将内存中的0地址特殊化// 数组名就是数组的首地址int arr[3] = { 1, 2, 3 };// 数组类型:int [3]// 元素类型:int// arr 类型:int*int* p7 = arr;return 0;
}

探究内存

/*1.变量在内存中所占的字节数所有的指针变量,不论类型,在内存中所占的字节数都是一样的,都是4个字节(或者8个字节)(8个字节是因为时代的发展,部分好的计算机性能得到提升,一般都是4个字节)2.指针本身的内存,以及指针指向的内存指针本身的内存:4个字节(指针变量只需要存储,所指向的变量的首地址)指针指向的内存:看你所指向的类型,视情况而定
*/# include <stdio.h>int main()
{    double num = 12.0;double* p1 = &num;printf("%f \n", num);printf("%f \n", *p1);    // 利用指针,取得 num 的值return 0;
}

在这里插入图片描述

指针的偏移

在这里插入图片描述

  • 大端模式与小端模式:前往学习

内存区域划分-基础

/*
内存区域的划分
四个:常量区,栈区,堆区,静态全局区
五个:常量区,栈区,堆区,静态全局区,代码区1.代码区:存代码
2.常量区:存常量
3.静态全局区:静态(static)变量,全局变量
4.栈区:普通局部变量
5.堆区:由程序员手动申请,手动释放
*/# include <stdio.h>int a;                // 普通“全局”变量(初识值默认为零)
// 作用域:当前项目
// 生命周期:程序开始到结束static int b;        // 静态“全局”变量(初识值默认为零)
// 作用域:当前文件
// 生命周期:程序开始到结束int main()
{    int c;            // 普通局部变量(无初始值)// 作用域:当前语块// 生命周期:当前语块static int d;    // “静态”局部变量(初识值默认为零)// 作用域:当前语块// 生命周期:程序开始到结束return 0;
}
# include <stdio.h>void func()
{static int num;        // 只会定义一次printf("%d \n", num);num++;printf("%d \n", num);}int main()
{    func();func();func();return 0;
} /*运行结果:011223请按任意键继续. . .
*/

空类型指针

/*void* 指针1.不能自增自减2.不能偏移3.不能读取内容但是!可以接收任何类型的指针而不需要强转类型可以利用这个特点,将 void* 指针当作通用的存放地址的“容器”e.g.int a = 6,b = 8.8;int* p1 = &a;double* p2 = &b;void* p0 = NULL;    // 当作存放“内存地址”的容器使用p0 = p1;p0 = p2;...*/# include <stdio.h>int main()
{    void* p0 = NULL;return 0;
}

简单开辟内存

/*简单开辟内存1.申请---有两个函数能够实现申请内存的功能:A. malloc(参数:需要字节的总数);B. calloc(参数:每个需要的字节数,个数);返回值都是 void* 类型的指针2.使用3.释放free(参数:首地址)如果不释放的话,会导致“内存泄露”4.置空如果不置空的话,会出现“野指针”
*/# include <stdio.h>int main()
{    /* malloc */double* p = (double*)malloc(sizeof(double));    // 申请一个double类型大小的内存(8字节)*p = 3.14;    // 使用printf("%lf \n", *p);free(p);    // 通过 p 里面存储的首地址,找到相对应的内存,从这里开始释放,一直释放到,申请内存的时候,做了标记的地方p = NULL;    // 通过置空,让指针不再指向已经被释放掉的内存/* calloc */float* p1 = (float*)calloc(sizeof(float),1);*p1 = 3.14f;printf("%f \n", *p1);free(p1);p1 = NULL;printf("进阶运用 \n");// 进阶运用p = (double*)malloc(sizeof(double)*10);    // 申请10个 double 类型大小的连续的内存(补充:因为上面将p定为 double* 而且置空过了,所以可再度利用)for (int i = 0; i < 10; i++ ){    *(p + i) = 10 + i;    // 给值printf("%lf \n", *(p + i));    // 展示值}free(p);p = NULL;/*对于上面 for 循环部分的补充:p:里面存的是:申请的内存的首地址在一次申请中,申请的内存是连续的*(p + i) <===> p[i]        // 注意!它不是数组!*/return 0;
}
# include <stdio.h>int main()
{    // 指针布局int row = 3;int** pp = (int**)calloc(sizeof(int*), row);int len = 4;for (size_t i = 0; i < row; i++)    // size_t是什么?点我跳转学习{pp[i] = (int*)calloc(sizeof(int), len);}// 内容展示for (size_t i = 0; i < row; i++){for (size_t j = 0; j < len; j++){    pp[i][j] = i * 10 + j;    // 给值printf("%-5d", pp[i][j]);    // 展示值,注意!这里不是二维数组!(看不懂请回顾上页内容)}printf("\n");}// 释放内存for (size_t i = 0; i < row; i++){free(pp[i]);pp[i] = NULL;}free(pp);pp = NULL;return 0;
}

自动扩容

# include <stdio.h>int main()
{    int len = 5;    // 默认长度int* p = (int*)calloc(sizeof(int), len);int num = 1;for (size_t i = 0; num != 0; i++)    // 用户不输入0结束,就一直获取数据并复制到开辟的内存中{scanf("%d", &num);p[i] = num;        // 数据复制到开辟的内存中}for (size_t i = 0; p[i] != 0; i++){printf("%-5d", p[i]);    // 展示数据}free(p);p = NULL;return 0;
}
/*扩容的本质是:将小内存中的所有内容拷贝到大内存中,然后,再继续对大内存进行别的操作
*/# include <stdio.h>int main()
{    // 长度int len = 5;// 首次申请内存int* p = (int*)calloc(sizeof(int), len);int* temp = p;    // 成为p的分身,以防万一// 重复输入数据(并复制到内存中)int num = 1;int i = 0;while (scanf("%d", &num), num != 0){if (i < len)    // 没满的情况下{temp[i++] = num;    // 存完一次,记录一下}else   // 满了的情况下{len += 5;p = (int*)calloc(sizeof(int), len);        // 重新申请更大的内存for (int j = 0; j < i; j++){p[j] = temp[j];}free(temp);temp = NULL;temp = p;    // 继续成为当前p的分身temp[i++] = num;}}// 输出数据printf("--------------------\n");for (int j = 0; j != i; j++){printf("%d \n", temp[j]);}free(p);p = NULL;temp = NULL;return 0;
}

内存区域划分-进阶

/*内存区域的划分1.代码区存储代码2.常量区存储常量3.全局区(静态全局区)存储: 1.静态变量    2.全局变量# include <stdio.h>int c;            // 普通全局变量static int d;    // 静态全局变量int main(){int a;            // 普通局部变量static int b;    // 静态局部变量int c;    // 注意这个c不是上面的c,它们只是名字看起来一样而已a = 10;        // 普通局部变量没有默认初始值,所以需要自己赋值printf("a = %d \n", a);printf("b = %d \n", b);printf("c = %d \n", c);printf("d = %d \n", d);// 通过以上 printf,可以总结规律:静态全局区,默认的初始值为0// 作用域和生命周期作用域            生命周期普通全局变量        当前项目        程序开始到程序结束静态全局变量        当前文件        程序开始到程序结束普通局部变量        当前语块        当前语块静态局部变量        当前语块        程序开始到程序结束return 0;}4.栈区存储:普通局部变量从定义时系统自动分配内存,离开当前语块系统就会自动回收内存 5.堆区由程序员手动申请和释放
*/

指针与函数

/*1.指针函数返回值类型是指针的函数2.函数指针指向函数的指针
*/
// 1.指针函数// 下面的代码是一个错误的例子,你能发现它的错误吗?
# include <stdio.h>int* test();    // 声明int main()
{    int* temp = test();printf("%d \n", *temp);return 0;
} int* test()
{int num = 10;int* p = &num;return p;    // 返回了栈区变量的首地址(非常严重的问题!详情见下)
}/*下面的内容是在栈区,当运行完毕,系统会回收其内存资源:int* test(){int num = 10;int* p = &num;return p;}当函数返回栈区变量 num 的内存地址之后,函数运行完毕,系统回收 num 内存,供以后"某某东西"使用所以,返回的地址不但没有作用,还会导致以后非法访问内存的问题出现*/
// 2.函数指针/*函数指针的定义返回类型说明符 (*函数指针变量名)(参数列表);
*/# include <stdio.h>int func();    // 声明int main()
{    // 定义函数指针,并进行初始化int(*p)() = func;    // 即:定义了指针p,而且 p 等于 func(func里面存的是函数的首地址)func();p();return 0;
}int func()
{printf("成功执行了 func 函数!\n");return 6;
}
// 函数指针,知识扩展1# include <stdio.h>int func();    // 声明typedef int funcType();    // 将 int...() 取别名为 funcTypeint main()
{    funcType* p = func;p();return 0;
}int func()
{printf("成功执行了 func 函数!\n");return 6;
}
// 函数指针,知识扩展2# include <stdio.h>int func(int a, int b);    // 声明typedef int(*pfunc)(int a, int b);int main()
{    pfunc p = func;        // 这样也能定义函数指针int res = p(1,2);printf("%d \n", res);return 0;
}int func(int a, int b)
{printf("成功执行了 func 函数!\n");return a + b;
}

指针与数组

/*1.指针数组......2.数组指针......
*/
// 1.指针数组/*# include <stdio.h>int main()
{    // 定义并初始化"数组"int arr1[3] = { 1, 2, 3 };    // 数组 arr1[3] -> 里面存的都是 int 类型// 定义并初始化"指针数组"int* arr2[3] = { 地址1,地址2,地址三 };    // 数组 arr2[3] -> 里面存的都是 int* 类型arr2[2] = 新地址;return 0;
} */
// 2.数组指针/*定义"数组"指针:所指向的数组里面存的数据类型 (*数组指针名称)[所指向的数组的长度];
*/# include <stdio.h>int main()
{    int arr[3] = { 1, 2, 3 };    // 建立一个数组。
//    arr 里面存的是数组内存的首地址,而 [] 表示内存里面存的那一堆东西是数组,3 表示数组长度,int 表示数组里面存的数据是 int 类型int(*p)[3];    // 长度为 3 的数组指针p = arr;printf("%d \n", p[1]);return 0;
}
// 数组指针,知识扩展# include <stdio.h>typedef int(*pType)[3];    // 定义类型:int(*pType)[3],取别名为:pTypeint main()
{    int arr[3] = { 1, 2, 3 };pType p;    // 变量 p 的类型为 pType,而属于这种类型的变量 p 必然满足 int(*pType)[3] 模板格式p = arr;    // arr里面储存的“数组的内存首地址”复制给变量 pprintf("%d \n", (*p)[0]);    // 注意!不要写成 p[0],虽然 p 获得了 arr 里面存的首地址,但是 *p 才是代表数组整体return 0;
} /*同理:# include <stdio.h>typeof int pArr[3];int main(){int arr[3] = { 1, 2, 3 };pArr p;p = arr;}
*/

使用const修饰指针

/*const:常量,被它修饰的变量会具有常量的属性,使用 const 修饰指针包含三种情况1.常量指针(指向常量的指针)指向常量的指针 type const *p; 或者 const type *p;可以改变指向,但是不能用 *p 修改指向变量的值2.指针常量它是常量,本身不能改变,也就是不能改变指向因为指向不能改,所以必须初始化但是可以通过取内容修改指向的内存中的内容3.常量指针常量("常量指针"常量即:指针常量)指针本身是一个常量,指向的也是常量const int * const p = &a;不能改变指向,也不能改变指向的内存的内容
*/# include <stdio.h>int main()
{const int num = 0;    // 变量 num 使用 const 修饰了就不能被修改了// 1.常量指针int a = 0, b = 9;const int * p = &a;        // const -> intp = &b;    // 可以改变指向// 2.指针常量int c = 6;int* const p1 = &c;        // const -> p1*p1 = 10;    // 可以修改内容// 3.常量指针常量int d = 8;const int* const p = &d;    // const -> int 和 preturn 0;}

指针和结构体

/*指针与结构体:指针与结构体结合起来使用包含两种情况:一.指针成员结构体变量的成员中存在指针二.结构体指针指向结构体变量的指针
*/
// 指针成员# include <stdio.h>typedef struct
{int n;int m;int* p;    // 定义指针}MyStruct;int main()
{MyStruct mystr;mystr.n = 0;mystr.m = 0;mystr.p = NULL;    // 地址置空return 0;}
// 结构体指针# include <stdio.h>typedef struct
{int n;int m;}MyStruct;int main()
{MyStruct mystr;mystr.n = 0;mystr.m = 0;MyStruct* p = NULL;    // 定义一个指针 p ,它的类型是 MyStruct*,即该指针指向的是有 MyStruct 类型的变量(首地址)p = &mystr;    // mystr 便符合条件,可以将首地址 &mystr 赋值给 p// 注意!通过指针访问“结构体中的元素”的时候,用 -> 符号,而不是用 . 符号p->n = 9;p->m = 8;return 0;}

使用指针的注意事项

/*注意事项1.避免野指针推荐:每次定义指针都进行初始化(有指向就给指向,没指向就置空 )2.注意类型匹配3.防止内存泄漏只有堆区是自己申请,自己释放,其他地方都是系统分配,系统回收总结:指针能够直接操作内存,必须在自己明确用途的情况下使用,否则很可能会造成严重后果!
*/

相关文章:

C语言-3

定义指针 /*指针的概念:1.为了方便访问内存中的内容&#xff0c;给每一个内存单元&#xff0c;进行编号&#xff0c;那么我们称这个编号为地址&#xff0c;也就是指针。2.指针也是一种数据类型&#xff0c;指针变量有自己的内存&#xff0c;里面存储的是地址&#xff0c;也就是…...

Quartus工程的qsf配置约束文件介绍

一、qsf文件概述 qsf&#xff1a;Quartus Setting File&#xff0c;是Quartus工程的配置文件&#xff1b; 包含一个Quartus工程的所有约束&#xff0c;包括工程的软件版本信息、FPGA器件信息、引脚约分配、引脚电平分配&#xff0c;编译约束和用于Classic TimingAnalyzer的时…...

【网工】华为设备命令学习(Telnet)

本次实验AR3为我们实际中远程的路由&#xff0c;AR4模拟我们的设备&#xff0c;最终实现Telnet的远程控制路由&#xff01; 本次笔记主要记录Telnet技术实现原理&#xff0c;后续再补充具体配置代码。 Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的…...

搜索专项---最短路模型

文章目录 迷宫问题武士风度的牛抓住那头牛 一、迷宫问题OJ链接 本题思路:只需要记录各个点是有哪个点走过来的&#xff0c;就能递推得出路径。记录前驱假设从 1,1 这个点向下走到了2, 1&#xff0c;则将2,1这个点的前驱记为1,1。这样&#xff0c;将整张地图 bfs 后&#xff0c…...

安装PostgreSQL和PostGIS

安装环境 Windows 2019 Standard Server 安装PostgreSQL 安装PostgreSQL 16 安装PostGIS 用PostgreSQL 16对应的PostGIS https://download.osgeo.org/postgis/windows/pg16/ https://download.osgeo.org/postgis/windows/pg16/postgis-bundle-pg16x64-setup-3.4.1-1.exe 创建…...

MySQL-----DCL基础操作

▶ DCL简介 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL--管理用户 ▶ 查询用户 use mysql; select * from user; ▶ 创建用户 ▶ 语法 create user 用户名主机名 identified by 密码 设置为在任意主机上访问…...

Unity报错Currently selected scripting backend (IL2CPP) is not installed

目录 什么是il2cpp il2cpp换mono Unity打包报错Currently selected scripting backend (IL2CPP) is not installed 什么是il2cpp Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式。由于iOS AppStore…...

LeetCode79. Word Search——回溯

文章目录 一、题目二、题解 一、题目 Given an m x n grid of characters board and a string word, return true if word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertic…...

Linux命令-blkid命令(查看块设备的文件系统类型、LABEL、UUID等信息)

说明 在Linux下可以使用 blkid命令 对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备&#xff08;包括交换分区&#xff09;所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。 语法 blkid -L | -U blkid [-c…...

服务治理中间件-Eureka

目录 简介 搭建Eureka服务 注册服务到Eureka 简介 Eureka是Spring团队开发的服务治理中间件&#xff0c;可以轻松在项目中&#xff0c;实现服务的注册与发现&#xff0c;相比于阿里巴巴的Nacos、Apache基金会的Zookeeper&#xff0c;更加契合Spring项目&#xff0c;缺点就是…...

Javaweb之SpringBootWeb案例之异常处理功能的详细解析

3. 异常处理 3.1 当前问题 登录功能和登录校验功能我们都实现了&#xff0c;下面我们学习下今天最后一块技术点&#xff1a;异常处理。首先我们先来看一下系统出现异常之后会发生什么现象&#xff0c;再来介绍异常处理的方案。 我们打开浏览器&#xff0c;访问系统中的新增部…...

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后&#xff0c;F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法&#xff0c;帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道&#xff0c;Mac系统默认是没有开启 F1-F12 的使用的&#xff0c;平时我们使用的系统都可以使…...

linux下ipconfig命令报:command not found 解决方法

参考博文&#xff1a; linux下ipconfig命令报:command not found 解决方法 CentOS7更新yum报Could not resolve host:mirrorlist.centos.org; Unknown error解决办法...

Android导入其它项目慢,Gradel下载失败,另辟蹊径:使用离线gradle加载,附镜像方式

最近在开发中需要测试以前写的小项目。结果忘了换本地的gradle&#xff0c;提示下载失败。换了现在用的gradle&#xff0c;项目能跑了。虽然网上有很多很多教程了&#xff0c;但对我的情况也不是都适用。所以自己记录一下。本人水平有限&#xff0c;有不对的地方请帮我指正&…...

神经语言程式(NLP)项目的15 个开源训练数据集

一个聊天机器人需要大量的训练数据,以便在无需人工干预的情况下快速解决用户的询问。然而,聊天机器人开发的主要瓶颈是获取现实的、面向任务的对话数据来训练这些基于机器学习的系统。 我们整理了训练聊天机器人所需的对话数据集,包括问答数据、客户支持数据、对话数据和多…...

H5 红色文字抖动网址发布页/引导页源码

H5 红色文字抖动网址发布页/引导页源码 源码介绍&#xff1a;一款红色文字抖动网页源码&#xff0c;可用于引导页或网址发布页。 下载地址&#xff1a; https://www.changyouzuhao.cn/10470.html...

MacOS - 菜单栏上显示『音量』

教程步骤 点击打开系统偏好『设置』&#xff0c;并找到『控制中心』 在『控制中心模块』找到『声音』&#xff0c;选择『始终在菜单栏显示』...

深入理解常见的设计模式

目录 引言 1. 单例模式&#xff08;Singleton Pattern&#xff09; 应用场景&#xff1a; 示例代码&#xff1a; . 工厂模式&#xff08;Factory Pattern&#xff09; 应用场景&#xff1a; 示例代码&#xff1a; 3. 观察者模式&#xff08;Observer Pattern&#xff09…...

服务器解析漏洞及任意文件下载

1.服务器文件解析漏洞 文件解析漏洞,是指Web容器&#xff08;Apache、nginx、iis等&#xff09;在解析文件时出现了漏洞,以其他格式执行出脚本格式的效果。从而,黑客可以利用该漏洞实现非法文件的解析。 &#xff08;1) Apache linux系统中的apache的php配置文件在/etc/apac…...

ES6扩展运算符——三个点(...)用法详解

目录 1 含义 2 替代数组的 apply 方法 3 扩展运算符的应用 &#xff08; 1 &#xff09;合并数组 &#xff08; 2 &#xff09;与解构赋值结合 &#xff08; 3 &#xff09;函数的返回值 &#xff08; 4 &#xff09;字符串 &#xff08; 5 &#xff09;实现了 Iter…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...