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

【C语言】指针详解(一)

个人主页 : zxctscl
如有转载请先通知

文章目录

  • 1.内存与地址
  • 2.指针变量与地址
    • 2.1 取地址操作符&
    • 2.2 指针变量
    • 2.3 指针类型
    • 2.4 解引用操作符
    • 2.5 指针变量的大小
  • 3. 指针变量类型的意义
    • 3.1 指针的解引用
  • 4. const修饰指针
    • 4.1 const修饰变量
    • 4.2 const修饰指针变量
  • 5. 指针运算
    • 5.1 指针+-整数
    • 5.2 指针-指针
    • 5.3 指针的运算关系
  • 6. 野指针
    • 6.1 野指针成因
    • 6.2 如何规避野指针
      • 6.2.1 指针初始化
      • 6.2.2 小心指针越界
      • 6.2.3 指针变量不再使用时,及时置NULL,指针使用之前检查有效性
  • 7. assert断言
  • 8. 指针的使用和传址调用

1.内存与地址

大家对地址都不陌生,就像在生活中住酒店如何找到房间?那不就通过房卡上的房间号先确定楼层在确定房间。而这些房间号我们也叫地址。
把内存划分为一个个内存单元,一个单元为一个字节,而计算机中都是以一个比特位存储一个2进制位,一个字节也就是8个比特位。
这使得每个内存单元都有一个编号,通过这个编号,就能迅速找到这个内存空间。
在C语言中给地址起了新名叫:指针
内存编号

所以我们理解的:内存单元的编号 == 地址 == 指针

2.指针变量与地址

2.1 取地址操作符&

在C语言中创建变量其实就是在向内存申请空间。就像这样:

#include <stdio.h>
int main()
{int a = 5;return 0;
}

创建了整型变量a,内存中就申请了4个字节,用来存放整数5。每个字节都有地址,而上面申请的4个字节的地址分别在下面划红线四个。
在这里插入图片描述
如果我们想得到a的地址,就需要用到取地址操作符&
像下面这样就可,但值得注意的是我们打印的是地址用到的是**%p**。

#include <stdio.h>
int main()
{int a = 5;&a;printf("%p\n", &a);return 0;
}

x86

2.2 指针变量

我们通过取地址操作符&,得到的仅仅是地址,它就只是一个数值,有时候为了方便使用,我们把它用指针变量存储。

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

指针变量也是一种变量,不过是用来存放地址,存放在指针变量中的值被理解为指针。

2.3 指针类型

指针也是有类型的。
就像前面所写的:

int a = 5;
int* p = &a;

在p的左边就是int*,*说明的是p为指针变量,而前面的int就是说明p指向的是整型(int)类型的对象。
同理指向char型的指针变量就是char*

char b = 'a';
char* p = &b;

2.4 解引用操作符

在C语言中,我们找到地址,就可以对地址所指向的对象,而此时所要用到的就是解引用操作符(*)。

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

而在上面的代码中,原来a为5,我们通过指针拿到了a的地址,然后通过解引用操作*p=0将原来a的5改为0。

2.5 指针变量的大小

32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。
如果指针变量是⽤来存放地址的,那么指针变的⼤⼩就得是4个字节的空间才可以。
同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的⼤⼩就是8个字节。

#include <stdio.h>
int main()
{printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));printf("%zd\n", sizeof(float *));return 0;
}

32位平台下地址,指针变量大小是4个字节

x86
64位平台下地址,指针变量大小是8个字节
x64
结论:

  1. 32位平台下地址,指针变量大小是4个字节
  2. 64位平台下地址,指针变量大小是8个字节
  3. 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

3. 指针变量类型的意义

指针变量的大小和类型无关,只要是指针变量,在同一个平台下,大小都是一样的,为什么还要有各种各样的指针类型呢

3.1 指针的解引用

对比,下面2段代码,主要在调试时观察内存的变化。

//代码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* 的指针的解引用就能访问四个字节。

4. const修饰指针

4.1 const修饰变量

变量是可以修改的,如果把变量的地址交给一个指针变量,通过指针变量的也可以修改这个变量。
但是如果我们希望一个变量加上一些限制,不能被修改,怎么做呢?这就是const的作用。

#include <stdio.h>
int main()
{int m = 0;m = 20;//m是可以修改的const int n = 0;n = 20;//n是不能被修改的return 0;
}

在这里插入图片描述
代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就行修改,就不符合语法规则,就报错,致使没法直接修改n。

但是如果我们绕过n,使用n的地址,去修改n就能做到了,虽然这样做是在打破语法规则。

#include <stdio.h>
int main()
{const int n = 0;printf("n = %d\n", n);int* p = &n;*p = 20;printf("n = %d\n", n);return 0;
}

在这里插入图片描述
可以看到这里一个确实修改了,但是我们还是要思考一下,为什么n要被const修饰呢?就是为了不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让p拿到n的地址也不能修改n,那接下来怎么做呢?

4.2 const修饰指针变量

测试无const修饰的情况:

#include <stdio.h>
//代码1
void test1()
{int n = 10;int m = 20;int* p = &n;*p = 20;//ok?p = &m; //ok?
}

测试const放在*的左边情况:

void test2()
{//代码2int n = 10;int m = 20;const int* p = &n;*p = 20;//ok?p = &m; //ok?
}

在这里插入图片描述

测试const放在*的右边情况

void test3()
{int n = 10;int m = 20;int* const p = &n;*p = 20; //ok?p = &m; //ok?
}

在这里插入图片描述

测试*的左右两边都有const

void test4()
{int n = 10;int m = 20;int const* const p = &n;*p = 20; //ok?p = &m; //ok?
}

在这里插入图片描述
const修饰指针变量的时候:

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

5. 指针运算

指针的基本运算有三种,分别是:
• 指针± 整数
• 指针-指针
• 指针的关系运算

5.1 指针±整数

数组在内存中是连续存储的,只要知道第一个元素的地址,后面的元素依次就能找到。

int arr[]={1,2,3,4,5};

而所对应的下标为0,1,2,3,4。

在对不同类型指针变量加减时结果不同,
举个例子:

#include <stdio.h>
int main()
{int n = 10;int* p1 = &n;char* p2 = &n;printf("p1=%p\n", p1);printf("p1+1=%p\n", p1+1);printf("p2=%p\n", p2);printf("p2+1=%p\n", p2+1);return 0;
}

在下面为结果
int类型的就跳过了4个字节,
char类型就跳过1个字节
指针+-
结论:
指针的类型决定了,指针加减整数时,一次性跳过多少个字节。

5.2 指针-指针

在指针变量相同类型时,计算出的是中间间隔的个数。
举个例子:

#include <stdio.h>
int main()
{int arr[10] = { 0 };int* p1 = &arr[9];int* p2 = &arr[0];int ret = p1-p2 ;printf("%d\n", ret);return 0;
}

结果为
间隔9
指针类型不同时不能进行指针的加减运算。

5.3 指针的运算关系

计算数组的元素个数时,我们使用了sizeof(数组名),而sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
sizeof(arr[0])计算的是首元素的大小,单位也是字节。

#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);printf("%d\n", sz);return 0;
}

数组大小
数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:
1.sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
除此之外,任何地方使用数组名,数组名都表示首元素的地址。

6. 野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

6.1 野指针成因

  1. 指针未初始化
#include <stdio.h>
int main()
{int* p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}

在这里插入图片描述

  1. 指针越界访问
#include <stdio.h>
int main()
{int arr[10] = { 0 };int* p = &arr[0];int i = 0;for (i = 0; i <= 11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

在这里插入图片描述

  1. 指针指向的空间释放
#include <stdio.h>
int* test()
{int n = 100;return &n;
}
int main()
{int* p = test();printf("%d\n", *p);return 0;
}

在这里插入图片描述

6.2 如何规避野指针

6.2.1 指针初始化

如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL.NULL 是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。

#ifdef __cplusplus#define NULL 0
#else#define NULL ((void *)0)
#endif

初始化如下:

#include <stdio.h>
int main()
{int num = 10;int*p1 = &num;int*p2 = NULL;return 0;
}

6.2.2 小心指针越界

一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。

6.2.3 指针变量不再使用时,及时置NULL,指针使用之前检查有效性

当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL。因为约定俗成的一个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。
我们可以把野指针想象成野狗,野狗放任不管是⾮常危险的,所以我们可以找一棵树把野狗拴起来,就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓前来,就是把野指针暂时管理起来。
不过野狗即使拴起来我们也要绕着走,不能去挑逗野狗,有点危险;对于指针也是,在使用之前,我们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是不能直接使用,如果不是我们再去使用。

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,67,7,8,9,10 };int* p = &arr[0];for (i = 0; i < 10; i++){*(p++) = i;}//此时p已经越界了,可以把p置为NULLp = NULL;//下次使⽤的时候,判断p不为NULL的时候再使⽤//...p = &arr[0];//重新让p获得地址if (p != NULL) //判断{//...}return 0;
}

7. assert断言

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

assert(p != NULL);

代码在程序运行到这一行语句时,验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序继续运行,否则就会终止运行,并且给出报错信息提示。
assert() 宏接受一个表达式作为参数。如果该表达式为真(返回值非零), assert() 不会产生任何作用,程序继续运行。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。
assert() 的使用对程序员是非常友好的,使用assert() 有几个好处:它不仅能自动标识文件和出问题的行号,还有一种无需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问题,不需要再做断言,就在 #include<assert.h> 语句的前面,定义一个宏 NDEBUG 。

#define NDEBUG
#include <assert.h>

然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。如果程序⼜出现问题,可以移除这条 #define NDBUG 指令(或者把它注释掉),再次编译,这样就重新启⽤了 assert() 语句。

assert() 的缺点是,因为引入了额外的检查,增加了程序的运行时间。
⼀般我们可以在debug中使用,在release版本中选择禁⽤assert就行,在VS这样的集成开发环境中,在release版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在release版本不影响用户使用时程序的效率。

8. 指针的使用和传址调用

学习指针的目的是使用指针解决问题,那什么问题,非指针不可呢?
例如:写一个函数,交换两个整型变量的值
一番思考后,我们可能写出这样的代码

#include <stdio.h>
void Swap1(int x, int y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap1(a, b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

在这里插入图片描述
其实没产生交换的效果,这是为什么呢?
调试一下,试试呢?
在这里插入图片描述
我们发现在main函数内部,创建了a和b,a的地址是0x00cffdd0,b的地址是0x00cffdc4,在调用Swap1函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收a和b的值,但是x的地址是0x00cffcec,y的地址是0x00cffcf0,x和y确实接收到了a和b的值,不过x的地址和a的地址不一样,y的地址和b的地址不一样,相当于x和y是独立的空间,那么在Swap1函数内部交换x和y的值,自然不会影响a和b,当Swap1函数调用结束后回到main函数,a和b的没法交换。Swap1函数在使用的时候,是把变量本身直接传递给了函数,这种调用函数的方式我们之前在函数的时候就知道了,这种叫传值调用。

结论:实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改不影响实参。所以Swap是失败的了。

那怎么办呢?
我们现在要解决的就是当调用Swap函数的时候,Swap函数内部操作的就是main函数中的a和b,直接将a和b的值交换了。那么就可以使用指针了,在main函数中将a和b的地址传递给Swap函数,Swap函数里边通过地址间接的操作main函数中的a和b就好了

#include <stdio.h>void Swap2(int* px, int* py)
{int tmp = 0;tmp = *px;*px = *py;*py = tmp;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap2(&a, &b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

在这里插入图片描述
有问题请指出,大家一起进步!!!

相关文章:

【C语言】指针详解(一)

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1.内存与地址2.指针变量与地址2.1 取地址操作符&2.2 指针变量2.3 指针类型2.4 解引用操作符2.5 指针变量的大小 3. 指针变量类型的意义3.1 指针的解引用 4. const修饰指针4.1 const修饰变量4.2 const修饰指针变量…...

unity3D雨雪等粒子特效不穿透房屋效果实现(粒子不穿透模型)

做项目有时候会做天气模拟,模拟雨雪天气等等。但是容易忽略一个问题,就是房屋内不应该下雨或者下雪,这样不就穿帮了嘛。 下面就粒子穿透物体问题做一个demo。 正常下雨下雪在室内的话,你可以看到,粒子是穿透建筑的。 那要怎么模拟真实的雨雪天气,不让粒子穿透房屋建筑呢…...

ROS2安装cartographer

2. 安装Cartographer和Cartographer ROS 使用apt安装&#xff08;推荐&#xff09;&#xff1a; bash sudo apt install ros-humble-cartographer-ros或者&#xff0c;从源代码安装&#xff1a; bash sudo apt-get update sudo apt-get install -y python3-wstool python3…...

kafka测试

1】确认 ZooKeeper 服务状态 为了进一步确认 ZooKeeper 服务的状态&#xff0c;你可以执行以下操作&#xff1a; 检查 ZooKeeper 服务状态&#xff1a; docker ps 确保 ZooKeeper 容器正在运行。 检查 ZooKeeper 日志&#xff1a; docker logs zookeeper 查看最新的日志条目&…...

总结C/C++中内存区域划分

目录 1.C/C程序内存分配主要的几个区域&#xff1a; 2.内存分布图 1.C/C程序内存分配主要的几个区域&#xff1a; 1、栈区 2、堆区 3、数据段&#xff08;静态区&#xff09; 4.代码段 2.内存分布图 如图&#xff1a; static修饰静态变量成员——放在静态区 int globalVar 是…...

第168天:应急响应-ELK 日志分析系统Yara规则样本识别特征提取规则编写

目录 案例一&#xff1a;ELK 搭建使用-导入文件&监控日志&语法筛选 案例二&#xff1a;Yara 规则使用-规则检测&分析特征&自写规则 案例一&#xff1a;ELK 搭建使用-导入文件&监控日志&语法筛选 该软件是专业分析日志的工具&#xff0c;但是不支持安…...

MySQL 面试题及答案

MySQL 面试题及答案&#xff1a; 一、基础问题 什么是数据库索引&#xff1f;有哪些类型&#xff1f; 答&#xff1a;数据库索引是一种数据结构&#xff0c;用于提高数据库查询的效率。它就像一本书的目录&#xff0c;可以快速定位到特定的数据行。 类型主要有&#xff1a; …...

vue仿chatGpt的AI聊天功能--大模型通义千问(阿里云)

vue仿chatGpt的AI聊天功能–大模型通义千问&#xff08;阿里云&#xff09; 通义千问是由阿里云自主研发的大语言模型&#xff0c;用于理解和分析用户输入的自然语言。 1. 创建API-KEY并配置环境变量 打开通义千问网站进行登录&#xff0c;登陆之后创建api-key&#xff0c;右…...

养老院管理系统(含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 养老院管理系统拥有两种角色&#xff1a;管理员和护工 管理员&#xff1a;用户管理、老人信息管理、事故记录管理、入住费用管理、护工薪资管理、护工请假管理、床位管理、请假管理等 护…...

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …...

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据&#xff0c;训练同一个网络。比如&#xff0c;先用A数据训练一下网络&#xff0c;然后再用B数据训练一下网络&#xff0c;那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的&#xff0c;比如先用A训练…...

MCUboot 和 U-Boot区别

MCUboot 和 U-Boot 都是用于嵌入式系统的引导加载程序&#xff0c;但它们在一些方面存在区别&#xff1a; 功能特性 安全特性侧重不同 MCUboot &#xff1a;更专注于安全引导方面&#xff0c;强调安全启动、固件完整性验证和加密等安全功能。它提供了强大的安全机制来防止恶意…...

Apache OFBiz SSRF漏洞CVE-2024-45507分析

Apache OFBiz介绍 Apache OFBiz 是一个功能丰富的开源电子商务平台&#xff0c;包含完整的商业解决方案&#xff0c;适用于多种行业。它提供了一套全面的服务&#xff0c;包括客户关系管理&#xff08;CRM&#xff09;、企业资源规划&#xff08;ERP&#xff09;、订单管理、产…...

计算机毕业设计 饮食营养管理信息系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

828华为云征文|华为云Flexus云服务器X实例部署——盲盒抽奖商城系统以及编译发布小程序

盲盒抽奖商城系统使用 thinkphp6.0 uniapp 开发&#xff0c;做到了全移动端兼容。一个系统不仅可以打包 小程序 还可以 打包APP &#xff0c;H5 华为云Flexus云服务器X实例在安装搭建盲盒商城小程序方面具有显著优势&#xff0c;这些优势主要体现在以下几个方面&#xff1a; …...

优化理论及应用精解【12】

文章目录 最优化基础基本概念一、目标函数二、约束条件三、约束函数 可行域与可行点可行点可行域可行点与可行域的关系示例 最优值与可行域的关系1. 最优值一定在可行域内取得2. 可行域定义了最优解的搜索空间3. 最优值的存在性与可行域的性质有关4. 最优值与可行域的边界关系示…...

excel 填充内容的公式

多行填充快捷方式&#xff1a; 使用“CtrlEnter”键&#xff0c;这样所有选中的空单元格前就会自动添加上相同的字符。 对于多行填充&#xff0c;Excel提供了几个快捷键来提高工作效率&#xff1a; “CtrlR”用于向右填充数据。如果你在表格的某一列输入了数据&#xff0c;选…...

这款工具在手,前端开发轻松搞定!

这款工具在手&#xff0c;前端开发轻松搞定&#xff01; 引言 在之前的一篇文章中&#xff0c;已经给大家分享了一款AI助手。尽管该助手能够生成前端代码&#xff0c;但遗憾的是缺少了实时预览的功能。而现在&#xff0c;这一缺憾已经被弥补——你只需要描述你的设计想法&…...

Hadoop三大组件之HDFS(一)

HDFS 简介 HDFS (Hadoop Distributed File System) 是一个分布式文件系统&#xff0c;用于存储文件&#xff0c;采用目录树结构来定位文件。它由多个服务器组成&#xff0c;每个服务器在集群中扮演不同的角色。 适合一次写入&#xff0c;多次读取的场景。文件创建、写入和关闭…...

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

docker容器安装nginx

docker安装nginx部署前端项目 拉取镜像 docker pull nginx:1.24.0运行容器 docker run --name nginx -p 80:80 -d nginx:1.24.0创建本地挂载的目录 mkdir -p /docker/nginx/conf mkdir -p /docker/nginx/log mkdir -p /docker/nginx/html复制运行的nginx配置到宿主机上 将…...

LC记录一:寻找旋转数组最小值、判断旋转数组是否存在给定元素

文章目录 33.搜索旋转排序数组81.搜索旋转排序数组||153.寻找旋转排序数组中的最小值154.寻找旋转排序数组中的最小值||参考链接 33.搜索旋转排序数组 https://leetcode.cn/problems/search-in-rotated-sorted-array/description/ 下面这张图片是LC154题官方题解提供的一个图…...

关于 JVM 个人 NOTE

目录 1、JVM 的体系结构 2、双亲委派机制 3、堆内存调优 4、关于GC垃圾回收机制 4.1 GC中的复制算法 4.2 GC中的标记清除算法 1、JVM 的体系结构 "堆"中存在垃圾而"栈"中不存在垃圾的原因&#xff1a; 堆&#xff08;Heap&#xff09; 用途&#xff…...

网络工程和信息安全专业应该考哪些证书?

网络工程和信息安全专业在校大学生可以考的网络信息安全方向证书有NISP一级、NISP二级、CISP-DSG、CISP-PTE&#xff01; 一、NISP一级 NISP一级是网络安全行业入门证书&#xff01; NISP一级报名条件&#xff1a;年满16周岁即可 NISP一级报名时间&#xff1a;随时可报 NI…...

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中&#xff0c;执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中&#xff0c;我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1&#xff1a;创建 EmailMessage 类 首先&#xff0c…...

从Linux系统的角度看待文件-基础IO

目录 从Linux系统的角度看待文件 系统文件I/O open write read 文件操作的本质 vim中批量注释的方法 从Linux系统的角度看待文件 关于文件的共识&#xff1a; 1.空文件也要占用磁盘空间 2.文件内容属性 3.文件操作包括文件内容/文件属性/文件内容属性 4.文件路径文…...

总结之Coze 是一站式 AI Bot 开发平台——工作流使用及coze总结(三)

工作流介绍 工作流支持通过可视化的方式&#xff0c;对插件、大语言模型、代码块等功能进行组合&#xff0c;从而实现复杂、稳定的业务流程编排&#xff0c;例如旅行规划、报告分析等。 当目标任务场景包含较多的步骤&#xff0c;且对输出结果的准确性、格式有严格要求时&…...

汽车线束之故障诊断方案-TDR测试

当前&#xff0c;在汽车布局中的线束的性能要求越来越高。无法通过简单的通断测试就能满足性能传输要求。早起对智能化要求不高&#xff0c;比如没有激动雷达、高清摄像、中央CPU等。 近几年的智能驾驶对网络传输要求越来越高&#xff0c;不但是高速率&#xff0c;还需要高稳定…...

自己做个国庆75周年头像生成器

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 下载相关代码&#xff1a;【免费】《自己做个国庆75周年头像生成器》代码资源-CSDN文库 又是一年国庆节&#xff0c;今年使用国旗做…...

2k1000LA loongnix 安装java

问题&#xff1a; 客户 需要在 loongnix 上 使用 java 的程序。 情况说明&#xff1a; 使用 apt get 是无法 安装java 的。 按照的资料就行。 首先是 下载 loongarch64 的 java 的压缩包。这个我已经下载下来了。 社区下载地址&#xff1a; http://www.loongnix.cn/zh/api/…...

那个网站可以查询美做空基金/色盲测试图

一、下载安装CLion 去Jetbrain公司官网下载CLion&#xff0c; 链接: https://www.jetbrains.com/clion/download/#sectionwindows 安装的话&#xff0c;随意即可。 下载配置MinGW MinGW是GCC编译器在window环境下的版本 打开下载地址&#xff1a;MinGW 进入下载页面&…...

做淘宝客的网站需要备案吗/seo索引擎优化

自学PMP报考--考试全流程&#xff1a;如何自学通过PMP? PMP考试是需要35PDU才可以报名的&#xff0c;如果你要自学就可以在某宝上购买PDU&#xff0c;但是个人不建议&#xff08;PDU证明一般是需要授权培训机构提供&#xff0c;在某宝买的第一不知道是否正规&#xff0c;第二…...

上网行为管理系统/淘宝关键词优化推广排名

解决方法&#xff1a; 1。 改表法。 可能是你的帐号不允许从远程登陆&#xff0c;只能在localhost。这个时候只要在localhost的那台电脑&#xff0c;登入mysql后&#xff0c;更改 "mysql" 数据库里的 "user" 表里的 "host" 项&#xff0c;从&quo…...

皮具 东莞网站建设/西安网是科技发展有限公司

1 当在单元格中输入的数字大于15位时&#xff0c;excel自动对数值进行截断处理。这是可以将单元格格式设置为文本格式。其步骤为右键单击单元格选择‘设置单元格格式,选择数字选项中的‘文本’&#xff0c;然后点击‘确定’即可。转载于:https://blog.51cto.com/rista/987496...

基于jquery做的网站/深圳产品网络推广

编译/运行 编译时是静态加载&#xff0c;如我们的new();运行时是动态加载&#xff0c;Class.forName(); Demo走起 class Main {public static void main(String[] args) throws Exception{if("Excel".equals(args[0])){Excel excel new Excel();excel.start();…...

企业营销的网站/东莞seo网络营销

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;http://www.swiper.com.cn/下载&#xff1a;…...