C++指针(三)
个人主页:PingdiGuo_guo
收录专栏:C++干货专栏
文章目录
前言
1.字符指针
1.1字符指针的概念
1.2字符指针的用处
1.3字符指针的操作
1.3.1定义
1.3.2初始化
1.4字符指针使用注意事项
2.数组参数,指针参数
2.1数组参数
2.1.1数组参数的概念
2.1.2数组参数的作用
2.1.3一维数组的传参
2.1.4二维数组的传参
2.2指针参数
2.2.1指针参数的概念
2.2.2指针参数的作用
2.2.3一级指针与二级指针
2.2.3一级指针的传参
2.2.4二级指针的传参
2.3练习
2.3.1数组参数的练习题目
2.3.2指针参数的练习题目
总结
前言
相关文章:C++指针(二)、C++指针(一)
本篇博客是介绍字符指针,数组参数与指针参数的。
点赞破五十,更新下一期。
1.字符指针
1.1字符指针的概念
字符指针是指向字符数组或字符串的指针。在C语言中,字符数组和字符串都是以字符指针的形式来操作和访问的。字符指针指向字符数组或字符串的第一个字符的地址,通过指针可以访问数组或字符串中的各个字符。
1.2字符指针的用处
字符指针有很多用途,以下是一些常见的用途:
1. C字符串操作:字符指针可以用来处理C字符串,包括字符串的拷贝、连接、比较等操作。由于C字符串以null字符结尾,我们可以使用字符指针来访问和操作字符串的每个字符。
2. 字符串数组访问:字符指针可以用于访问字符串数组中的每个字符串。通过递增指针的方式,可以依次访问字符串数组中的每个元素。
3. 动态内存分配:字符指针可以用于动态分配内存,即在程序运行时根据需要分配内存空间。通过使用`new`运算符,可以分配一段连续的内存,并返回第一个元素的指针。
4. 字符指针数组:字符指针可以用于创建指向字符的指针数组。这在处理多个字符串时非常有用,每个指针可以指向一个独立的字符串。
5. 文件操作:字符指针可以用于进行文件的读取和写入操作。通过指针的方式,我们可以逐字符或逐行读取文件内容,并将指针移动到文件的特定位置。
这些只是字符指针的一些常见用途,实际上,字符指针在C和C++中有广泛的应用,可以用于字符串处理、动态内存管理、文件操作等多种场景。
1.3字符指针的操作
1.3.1定义
字符指针需要关键字char*来定义,其他部分与普通指针的定义相同。如下:
char* ptr;
这样,我们就定义了一个字符指针。
1.3.2初始化
字符指针初始化有两种方式:
1.定义一个字符并为其赋值,然后用&来获取这个字符变量的地址。代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{char ch = 'w';char* pc = &ch;cout<<*pc<<endl;return 0;
}
到这里,可能有些同学会疑惑:*pc里不是存储了变量ch的地址了么,为啥输出的是ch里的值呢?
这里我们要注意,在代码中,
*pc
是一个解引用操作符,它用于获取指针pc
所指向的内存地址上存储的值。在这种情况下,*pc
表示获取指针pc
所指向的内存地址上存储的字符。所以,cout<<*pc
输出的是ch
里的值,即字符w
。
那可能有些同学又要问了:PingdiGuo_guo,那啥情况输出的是地址呢?
注意:当我们直接输出指针变量本身时,会输出该指针变量所存储的地址而不是地址上的值。如果要输出指针变量所指向的地址上的值,需要使用解引用操作符*。
以下是一个例子:
#include <iostream>
using namespace std;int main() {int x = 10;int* ptr = &x;cout << ptr << endl; // 输出指针变量ptr的值,即x的地址cout << *ptr << endl; // 输出指针ptr所指向的地址上存储的值,即x的值return 0;
}
上述代码输出结果:
第一行输出的是指针变量ptr存储的地址,第二行输出的是指针ptr所指向的地址上存储的值。
2.我们直接把一个字符串赋值给指针变量。如下:
#include <iostream>
using namespace std;
int main()
{const char* ps = "hello.";cout<<ps<<endl;return 0;
}
大家看一看,运行上述代码,*ps里储存的是什么呢?
有同学觉得储存的的应该是字符串"hello."的地址,实际上储存的是字符串"hello."的首字符,也就是字符'h'的地址。
1.4字符指针使用注意事项
字符指针使用注意事项:
1. 注意字符串的结束符:C语言中的字符串以'\0'作为结束符,因此在使用字符指针操作字符串时,需要确保字符串末尾有一个'\0'字符,否则可能导致未定义的行为。
2. 避免修改字符串常量:字符串常量是只读的,因此尝试修改字符串常量的内容会导致编译错误或者运行时错误。如果需要修改字符串,应该使用可修改的字符数组或者动态分配内存的字符指针。
3. 空指针检查:在使用字符指针之前,应该进行空指针检查,以避免对空指针进行操作,导致程序崩溃或者出现未定义的行为。
4. 确保指针指向有效的内存区域:在使用字符指针操作字符串时,应确保指针指向的内存区域包含了足够的空间,以存储字符串的内容,并且字符串的结束符'\0'也需要在指针指向的内存区域内。
5. 避免指针越界访问:在使用字符指针操作字符串时,应避免指针越界访问,即超过了字符串的有效范围进行访问,这可能导致程序崩溃或者出现未定义的行为。
6. 避免指针悬挂:在使用字符指针时,需要确保指针指向的内存区域有效,并且在指针不再使用时及时释放或者置为NULL,以避免产生悬挂指针或者内存泄漏的问题。
7. 注意指针运算的规则:字符指针支持指针运算,例如指针加法和指针减法,但要注意指针运算时遵循指针的类型大小,以避免指针运算越界或者计算错误。
8. 使用函数库提供的字符串操作函数:C语言提供了一系列函数库来操作字符串,例如strcpy、strlen、strcat等,使用这些函数能够更方便、安全地操作字符串,同时避免常见的错误。
2.数组参数,指针参数
2.1数组参数
2.1.1数组参数的概念
数组参数是指在函数的参数列表中声明一个数组作为参数。当函数被调用时,实际传递给该参数的是数组的地址,而不是整个数组本身。通过使用数组参数,可以将数组的内容传递给函数,并在函数中对数组进行操作或者返回相应的结果。
2.1.2数组参数的作用
数组参数在函数中的作用主要包括以下几点:
1. 传递数组数据:通过数组参数,可以将数组的数据传递给函数进行处理。函数可以读取、修改数组的元素,执行各种操作。
2. 减少内存开销:使用数组参数可以避免将整个数组的副本传递给函数,而是只传递数组的地址或首元素地址。这样可以减少内存开销和数据复制次数。
3. 返回数组数据:函数也可以通过数组参数返回数据。在函数内部修改数组元素后,函数外部的数组也会被修改。
4. 可变长度数组:在函数参数中使用可变长度数组,可以根据需要传递不同大小的数组。这样可以编写更加灵活的函数,适应不同规模的数据。
5. 简化代码:通过使用数组参数,可以将对数组的一系列操作封装在函数中,提高代码的可读性和可维护性。
总的来说,数组参数可以使函数更加灵活、高效地处理数组数据,提高代码的可复用性和可维护性。它是C语言中非常重要的函数参数类型之一。
2.1.3一维数组的传参
void is(int a[])
{
}
void id(int a[100])
{
}
void ih(int* a[10])
{
}
void ij(int* a)
{
}
void ig(int** a)
{
}
注:上述这些格式都可以运行。
2.1.4二维数组的传参
二维数组的传参基本形式与一维数组类似,只是在声明参数时需要指明数组的行数和列数。
// 形参为二维数组,指定列数的方式
void functionName(dataType arrayName[][columns], int rows) {// 函数体// 可以通过双重循环访问和修改数组元素
}
// 形参为二维数组,指定指针的方式
void functionName(dataType *arrayName[], int rows, int columns) {// 函数体// 可以通过双重循环访问和修改数组元素
}
// 形参为二维数组,指定指向指针的指针的方式
void functionName(dataType **arrayName, int rows, int columns) {// 函数体// 可以通过双重循环访问和修改数组元素
}
在上述代码中,dataType是数组中元素的数据类型,arrayName是二维数组的名称,rows是数组的行数,columns是数组的列数。
在函数参数列表中,我们可以使用dataType arrayName[][columns]或者dataType *arrayName[]或dataType **arrayName来声明一个二维数组作为参数。
在函数体内部,可以使用双重循环来访问和修改二维数组的元素。
2.2指针参数
2.2.1指针参数的概念
指针参数是指函数中的参数被声明为指针类型的参数。指针参数允许函数通过引用传递内存地址,从而能够修改原始数据的值。
2.2.2指针参数的作用
指针参数的作用有以下几个方面:
1. 传递大型数据结构:通过将指针作为参数传递给函数,可以避免复制整个数据结构。这对于大型结构体或数组来说尤为重要,可以提高程序性能。
2. 在函数内部修改变量的值:通过传递指向变量的指针作为参数,函数可以直接修改变量的值。这对于需要在函数中修改全局变量或者需要通过函数返回多个值的情况非常有用。
3. 动态内存分配:通过指针参数,可以在函数内部对动态分配的内存进行操作。例如,在函数中动态创建一个数组,并通过指针参数返回数组的地址。
4. 传递数组:通过将数组的首地址作为指针参数传递给函数,可以在函数内部操作数组中的元素。
需要注意的是,使用指针参数需要谨慎,避免出现空指针或者越界访问等问题。在使用指针参数时,需要确保传递正确的地址,并在函数内部对指针进行适当的处理和保护。
总之,指针参数在函数传参中具有重要作用,可以通过引用传递内存地址,实现对变量和数据的修改和操作。
2.2.3一级指针与二级指针
一级指针和二级指针是指针的不同级别。
一级指针(Level 1 Pointer)是指一个指针变量(如int*)指向一个存储地址,该地址保存了一个值或者另一个指针。通过一级指针可以直接访问到被指向的内存地址中的值。
二级指针(Level 2 Pointer),也被称为指向指针的指针,是指一个指针变量(如int**)存储了一个指针的地址。通过二级指针可以间接地访问到被指向的内存地址中的值。
二级指针常用于需要对一级指针进行修改的情况,例如在函数中传入一个指针的指针,以便修改指针的值。同时,你也可以定义三级指针、四级指针以及更高级别的指针,但在实际开发中很少用到。
2.2.3一级指针的传参
一级指针的传参是通过将指针作为函数的参数传递给函数。
在函数中,可以通过一级指针来访问和修改指针所指向的值。
下面是一级指针传参的基本形式:
void func(int* ptr) {// 使用指针访问和修改指针所指向的值*ptr = 10;// ...
}int main() {int x = 0;int* p = &x;// 将指针p作为参数传递给函数funcfunc(p);// x的值已经被修改为10return 0;
}
在上面的例子中,通过将指针p作为参数传递给函数func,函数内部可以通过指针ptr来访问和修改p所指向的值。在函数中,通过解引用操作符*来访问指针所指向的值。
需要注意的是,传递一级指针作为参数时,函数内部对指针所指向的值的修改是有效的,因为传递的是指针变量本身的地址,而不是指针变量的副本。
问:在这种情况下,函数能接受什么参数?
答:在这种情况下,函数func
可以接受一个指向整型变量的指针作为参数。在main
函数中,通过将指针p
作为参数传递给func
函数,函数func
可以使用指针访问和修改指针所指向的值。
2.2.4二级指针的传参
二级指针的传参是通过将指向指针的指针作为函数的参数传递给函数。
二级指针在某些情况下用于传递指针数组或二维数组的地址,或者用于动态分配内存等场景。
下面是二级指针传参的基本形式:
void func(int** ptr) {// 使用二级指针访问和修改指针所指向的值**ptr = 20;// ...
}int main() {int x = 0;int* p = &x;int** pp = &p;// 将二级指针pp作为参数传递给函数funcfunc(pp);// x的值已经被修改为20return 0;
}
在上面的例子中,通过将二级指针pp作为参数传递给函数func,函数内部可以通过二级指针ptr来访问和修改pp所指向的值。在函数中,通过解引用操作符*两次来访问指针所指向的值。
需要注意的是,传递二级指针作为参数时,需要对指针进行两次解引用才能访问到最终的值。在函数内部修改指针所指向的值也是有效的。
此外,还要注意对于二维数组的传参,可以使用一级指针或二级指针来传递二维数组的地址。
问:在这种情况下,函数能接受什么参数?
答:在这种情况下,函数func
可以接受一个指向指向整型变量的一级指针的二级指针作为参数。
2.3练习
2.3.1数组参数的练习题目
题目:
编写一个函数,接收一个整型数组和数组长度作为参数,并返回数组中的最大值。
步骤:
1. 在main函数中声明一个整型数组并初始化。
2. 定义一个函数findMax,接收一个整型数组和数组长度作为参数,并返回一个整型值。
3. 在findMax函数中,定义一个变量max,初始化为数组的首个元素。
4. 使用循环遍历数组,比较数组中的每个元素与max的值,并更新它。
5. 返回最大值。
6. 在main函数中调用findMax函数,并将返回值打印出来。
流程图:
开始
声明和初始化数组以及定义数组长度
定义函数findMax,接收数组和长度作为参数,并返回最大值
定义变量max,并初始化为数组的首个元素
循环遍历数组比较当前元素和max的值,若大于max,则更新max的值
返回max
调用findMax函数并打印返回值
结束
代码:
#include <iostream>int findMax(int arr[], int size) {int max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max) {max = arr[i];}}return max;
}int main() {int arr[] = {3, 5, 1, 4, 2};int size = sizeof(arr) / sizeof(arr[0]);int max = findMax(arr, size);std::cout << "Max: " << max << std::endl;return 0;
}
在这个例子中,findMax函数接收一个整型数组和数组长度作为参数,并返回最大值。函数内部使用循环遍历数组,比较每个元素与max的值,并根据情况更新它。在main函数中声明数组arr并初始化,然后调用findMax函数并传递相应的参数,将返回值存储在max变量中,并使用std::cout 打印出来。
运行结果:
2.3.2指针参数的练习题目
题目:
编写一个函数,接收一个整型数组的指针和数组长度作为参数,并将数组中的所有元素翻转。
步骤:
1. 在main函数中声明一个整型数组并初始化。
2. 定义一个函数reverseArray,接收一个指向整型数组的指针和数组长度作为参数,并将数组中的所有元素翻转。
3. 在reverseArray函数中,使用两个指针start和end,分别指向数组的起始和末尾位置。
4. 使用循环,交换`start`和`end`指针所指向的元素,并同时将`start`往后移动一位,`end`往前移动一位。
5. 循环继续,直到start指针超过或等于end指针。
6. 在main函数中调用reverseArray函数,并将修改后的数组打印出来。
流程图:
开始
声明和初始化数组以及定义数组长度
定义函数reverseArray,接收整型数组指针和长度作为参数
定义指针start,指向数组起始位置
定义指针end,指向数组末尾位置
循环,交换start和end指针所指向的元素,并同时移动start和end指针若start指针超过或等于end指针,则跳出循环
在main函数中调用reverseArray函数,并打印修改后的数组
结束
代码:
#include <iostream>void reverseArray(int* arr, int size) {int* start = arr;int* end = arr + size - 1;while (start < end) {int temp = *start;*start = *end;*end = temp;start++;end--;}
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);std::cout << "Original array: ";for (int i = 0; i < size; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;reverseArray(arr, size);std::cout << "Reversed array: ";for (int i = 0; i < size; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;return 0;
}
在这个例子中,reverseArray函数接收一个指向整型数组的指针和数组长度作为参数,并将数组中的所有元素翻转。函数内部使用两个指针start和end分别指向数组的起始和末尾位置,通过循环交换指针所指向的元素,并同时移动指针,直到start指针超过或等于`end`指针。在main函数中声明数组arr并初始化,然后调用reverseArray函数并传递相应的参数,将数组的元素翻转。最后使用std::cout打印出原始数组和翻转后的数组。
运行结果:
总结
本篇博客到这里就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言,谢谢大家啦!
相关文章:
C++指针(三)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…...
二分查找4:35. 搜索插入位置
链接:35. 搜索插入位置 - 力扣(LeetCode) 题解: 本题是最基础的二分查找算法 class Solution { public:int searchInsert(vector<int>& nums, int target) {int left0;int rightnums.size()-1;int midleft(right-lef…...
数据可视化 —— 多边图应用(大全)
一、介绍: 多边形图,也就是在数据可视化中使用多边形来呈现数据的图表,在多个领域都有广泛的应用场景,以下为你详细介绍: 金融领域 投资组合分析:在投资组合管理中,多边形图可用于展示不同资…...
服务器加空间失败 growpart /dev/vda 1
[rootecm-2c5 ~]# growpart /dev/vda 1 unexpected output in sfdisk --version [sfdisk,来自 util-linux 2.23.2] [rootecm-2c5 ~]# xfs_info /dev/vda1 meta-data/dev/vda1 isize512 agcount21, agsize1310656 blks sectsz512 attr2, projid32bit1 crc1 finobt0…...
tree-sitter的grammar.js解惑
❓问题1:grammar.js 不是用正则表达式 /.../ 吗?为什么有 print 这样的字符串? ✅ 回答: grammar.js 分成两类“终结符”表示法: 表达方式含义xxx直接匹配该字符串字面量/regex/匹配符合正则的文本 💡 …...
前端-Vue3
1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…...
【毕设通关】——文献查阅
目录 🕒 1. 常见文献库🕒 2. 快速寻找文献🕒 3. 引用网页资料 🕒 1. 常见文献库 中文文献: CNKI中国知网万方数据维普资讯超星期刊 英文文献: 谷歌学术Sci-hubOALib(Open Access Library&am…...
贪心算法-跳跃游戏
55.跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。输入…...
程序化广告行业(75/89):行业发展与PC端和移动端投放差异
程序化广告行业(75/89):行业发展与PC端和移动端投放差异 在互联网广告领域,程序化广告正发挥着越来越重要的作用。今天,咱们就来一起深入了解一下程序化广告行业,希望能和大家一起学习进步,共同…...
Windows 下搭建 Git 本地服务器并进行开发
目录 1. 安装 Git for Windows 2. 创建本地 Git 仓库(裸仓库) 3. 设置本地开发环境 (1) 在开发机器上克隆仓库 (2) 提交代码 4. 远程访问本地 Git 服务器 方法 1:使用 SSH 访问 (1) 配置 SSH 服务器 (2) 客户端连接 方法 2…...
C++中stack函数的用法示例
C++中stack函数的用法示例 std::stack 是C++标准模板库(STL)中的一个容器适配器,它提供了后进先出(LIFO)的数据结构。以下是stack的一些常用函数及其用法示例: 1. 基本操作 #include <iostream> #include <stack>int main() {// 创建一个整数栈std::stack<…...
网络安全1
一、网络安全的定义与重要性 定义 网络安全(信息技术安全):保护计算机系统和网络免受电子攻击的技术和过程,包括保护个人信息和企业数据不被盗窃、破坏或非法访问。涵盖范围:网络设备、数据传输、系统运行安全。 重要…...
腾讯会议for flatpak
今天想切换opensuse,无意间查询了腾讯会议等软件的下载方式,发现腾讯会议是deb包安装的。但是过程中,我发现flatpak仓库中居然有腾讯会议,然后尝试着在wayland下的debian12中进行了安装。 发现居然可以正常开启视频等操作。 下载…...
【C++初学】C++核心编程技术详解(二):类与继承
函数提高 3.1 函数默认参数 函数的形参可以有默认值,调用时可以省略这些参数。 示例代码: int func(int a, int b 10, int c 10) {return a b c; }int main() {cout << "ret " << func(20, 20) << endl;cout <<…...
紧急任务插入,如何不影响原计划
面对紧急任务插入,为确保不影响原计划,需要做到:重新明确任务优先级、合理调整资源配置、灵活管理时间和任务、建立紧急任务处理流程、有效沟通与反馈。其中,重新明确任务优先级最为关键。这可以帮助项目团队快速确定哪些任务需立…...
蓝桥杯赛前题
开始每个人能量为3 答题了,答题者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…...
ETL的核心概念与价值
在数字化转型的浪潮中,数据已成为企业决策的基石。然而,面对分散、异构且质量参差不齐的数据源,如何高效整合并挖掘其价值?这一问题的答案,指向了一项关键的技术——ETL(Extract-Transform-Load)…...
神经动力学系统与计算及AI拓展
大脑,一个蕴藏在我们颅骨之内的宇宙,以活动脉动,如同由电信号和化学信号编织而成的交响乐,精巧地协调着思想、情感和行为。但是,这种复杂的神经元舞蹈是如何产生我们丰富多彩的精神生活的呢?这正是神经动力…...
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
前言 中等 、困难 √,越来越有手感了,二叉树done! 二叉树展开为链表 我的题解 前序遍历树,当遇到左子树为空时,栈里pop节点,取右子树接到左子树位置,同时断开该右子树与父节点的连接&#x…...
备赛蓝桥杯-Python-考前突击
额,,离蓝桥杯开赛还有十个小时,最近因为考研复习节奏的问题,把蓝桥杯的优先级后置了,突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了,再补充一些常用函数供明天考前再背背,算…...
蓝桥杯 Web 方向入门指南:从基础到实战
一、蓝桥杯 Web 方向简介 蓝桥杯是国内最具影响力的编程竞赛之一,Web 方向主要考察前端开发和后端服务能力。比赛形式为 4 小时限时编程,题型包括页面布局、数据交互、API 开发等。根据最新大纲,大学组需掌握 HTML5、CSS3、JavaScript、Vue.…...
生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介
生命篇—心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介 文章目录 生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介一、前言二、急救1、心肺复苏(CPR)(1)适用情况(2)操作…...
C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any
b站Cherno的课[76]-[80] 一、如何处理OPTIONAL数据 std::optional二、单一变量存放多类型的数据 std::variant三、如何存储任意类型的数据 std::any四、如何让C运行得更快五、如何让C字符串更快 一、如何处理OPTIONAL数据 std::optional std::optional C17 数据是否存在是可选…...
【Python Requests 库详解】
目录 简介一、安装与导入安装导入 二、发送 HTTP 请求1. GET 请求基本请求URL 参数 2. POST 请求表单数据提交JSON 数据提交文件上传 3. 其他方法PUT 请求示例DELETE 请求示例 三、处理响应1. 响应内容解析文本内容处理二进制内容处理JSON 数据处理 2. 响应状态与头信息状态码检…...
二维偏序-蓝桥20102,没写完
代码: 暴力:只过了35%,双重for循环o(n^2)1e10; #include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; typedef pair<int,int> PII;int main() {// 请在此输入您的代码//相当于…...
ASEG的鉴定
等位基因特异性表达(Allele-Specific Expression, ASE)基因的鉴定是研究杂种优势和基因表达调控的重要手段。以下是鉴定ASE基因的详细流程和方法: ### **1. 实验设计与样本准备** - **选择材料**:选择杂交种及其亲本作为研究材料。例如,玉米中的B73和Mo17及其杂交组合B73…...
从零开始:在 GrapesJS Style Manager 中新增 row-gap 和 column-gap
在前端开发中,页面样式的灵活性和可扩展性至关重要。GrapesJS 作为一个强大的网页构建工具,其内置的 Style Manager 提供了常见的 CSS 样式的可视化设置,极大地方便了开发者和设计师。然而,随着项目需求的不断变化,有些…...
解决双系统ubuntu24.04开机出现花屏等情况
1. 问题描述: 刚刚装上的双系统ubuntu24.04开机就出现花屏情况 2. 解决方案 安装显卡驱动 查看显卡型号 查看显卡硬件支持的驱动类型 ubuntu-drivers devices如果输入没有反映,请更新软件源,或者换官方软件源 sudo add-apt-repository…...
基于SpringBoot的智慧社区管理系统(源码+数据库)
499基于SpringBoot的智慧社区管理系统,系统包含三种角色:管理员、用户主要功能如下。 【用户功能】 1. 首页:查看系统。 2. 超市商品:浏览超市中各类商品信息。 3. 动物信息:了解社区内的动物种类和相关信息。 4. 车位…...
通俗理解CLIP模型如何实现图搜图乃至文搜图
一、图搜图与文搜图 图搜图和文搜图的场景相信大家并不少见,比如度娘的搜索框就可以直接上传图片找到相似的图片,还有某宝某团都有这种上传图片匹配到相似商品或者商品页的推荐的功能。那比如我想搜一张“正在跳舞的狗”的图片,是不是就能搜…...
谷歌最近放出大招——推出全新“Agent Development Kit(简称ADK)
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
std::string` 类
以下是对 std::string 类中 修改操作 和 字符串操作 的示例代码,帮助你更好地理解这些函数的使用: 5. 修改操作 (1) operator 用于追加字符串、C 风格字符串或字符。 #include <iostream> #include <string>int main() {std::string str …...
Sping Cloud配置和注册中心
1.Nacos实现原理了解吗? Nacos是注册中心,主要是帮助我们管理服务列表。Nacos的实现原理大概可以从下面三个方面来讲: 服务注册与发现:当一个服务实例启动时,它会向Nacos Server发送注册请求,将自己的信息…...
Java基础 - 泛型(常见用法)
文章目录 泛型类泛型方法泛型类派生子类示例 1:子类固定父类泛型类型(StringBox 继承自 Box<String>)示例 2:子类保留父类泛型类型(AdvancedBox<T> 继承自 Box<T>)示例 3:添加子类自己的…...
待排序元素规模较小时,宜选取哪种排序算法效率最高
当待排序元素规模较小时,通常选择以下几种简单高效的排序算法,因为它们在小规模数据下具有更低的常数开销和良好的局部性表现: ✅ 插入排序(Insertion Sort) 推荐理由:在数据量小、数据部分有序的情况下&a…...
SAQ评级是什么,SAQ评级的意义?对企业发展好处
SAQ评级(Supplier Audit Questionnaire,供应商审计问卷评级)是供应链管理中常见的一种评估机制,主要用于对供应商的质量、合规性、风险管理能力等进行标准化审核和分级。它常见于汽车、电子、医药等对供应链要求严格的行业&#x…...
嵌入式---电机分类
一、按电流类型分类(最基础分类) 1. 直流电机(DC Motor) 工作原理:通过换向器(有刷)或电子换向(无刷)将直流电源转换为交变磁场,驱动转子旋转。 核心特点&a…...
定制一款国密浏览器(5):修改浏览器名称
在上一章中,我介绍了如何修改浏览器的 logo,这一章介绍修改浏览器的名称。 浏览器的名称是 AI 帮我想的,英文名 Mojo Browser,中文名墨舟浏览器。 第一步先修改 desktop 文件,desktop 文件支持多语言化,遵循 Freedesktop.org 制定的 Desktop Entry Specification 规范。…...
水库大坝安全监测系统
水库大坝安全监测系统是现代水利管理中至关重要的组成部分,是一种用于实时监控和评估大坝结构安全状况的技术系统,通过多种技术手段实现对水库大坝的全方位、全天候监测,旨在确保大坝的稳定性和安全性,预防潜在风险。 系统构成 …...
文件IO5(JPEG图像原理与应用)
JPEG图像原理与应用 ⦁ 基本概念 JPEG(Joint Photographic Experts Group)指的是联合图像专家组,是国际标准化组织ISO制订并于1992年发布的一种面向连续色调静止图像的压缩编码标准,所以也被称为JPEG标准。 同样,JP…...
开源Cursor替代品——Void
我原先写过很多关于Cursor文章。 今天分享一个开源的 Cursor 替代方案。 如果你也热爱开源项目,那么这篇文章正是为你准备的! 寻找开源替代的原因 我一直在思考:市面上这类产品层出不穷,但真正的核心技术似乎都依赖于大语言模型(LLM)。于是萌生了一个想法——何不自己…...
DAOS系统架构-组件
如上图所示,一个完整的DAOS系统是由管理节点组件、客户端节点组件、服务端节点组件以及网络通信组件四个部分组成。管理节点组件通过管理网络通道(蓝色)对DAOS服务管理和监控。客户端节点组件通过数据网络通道(红色)与…...
论文精读:MSCA-Net:多尺度上下文聚合网络在红外小目标检测中的突破
论文地址:https://arxiv.org/pdf/2503.17193 目录 一、论文结构解析 二、三大创新点详解 1. 多尺度增强检测注意力(MSEDA) 2. 位置卷积块注意力模块(PCBAM) 3. 通道聚合模块(CAB) 三、实验结果对比 定量分析(表I关键数据) 定性对比 四、应用场景展望 五、总…...
LangGraph 使用指南
安装配置 安装依赖 LangGraph 可以通过 pip 安装: pip install langgraph如果您想使用最新的功能和改进,可以从源代码安装: pip install githttps://github.com/langchain-ai/langgraph.git环境配置 LangGraph 与 LangChain 共享许多配置…...
C++指针(四)万字图文详解!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三) 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…...
【AI提示词】长期主义助手提供规划支持
提示说明 长期主义是一种关注长期利益和持续学习的思维模式,帮助个人和组织在快速变化的环境中保持耐心和系统性思考。 提示词 # Role: Long-termist Assistant## Profile - language: 中文 - description: 长期主义是一种关注长期利益和持续学习的思维模式&…...
JavaScript逆向工程:如何判断对称加密与非对称加密
在现代Web应用安全分析中,加密算法的识别是JavaScript逆向工程的关键环节。本文将详细介绍如何在逆向工程中判断JavaScript代码使用的是对称加密还是非对称加密。 一、加密算法基础概念 1. 对称加密 (Symmetric Encryption) 特点:加密和解密使用相同的…...
制造企业如何通过实现数据统一?
随着生产规模的扩大、供应链的复杂化以及市场需求的快速变化,企业内部的数据管理问题日益凸显。数据孤岛、数据冗余、数据不一致等问题不仅降低了运营效率,还可能导致决策失误。那么,制造企业如何才能打破这些壁垒,实现数据的统一…...
ICRA-2025 | 视觉预测助力机器人自主导航!NavigateDiff:视觉引导的零样本导航助理
论文:Yiran Qin 1 , 2 ^{1,2} 1,2, Ao Sun 2 ^{2} 2, Yuze Hong 2 ^{2} 2, Benyou Wang 2 ^{2} 2, Ruimao Zhang 1 ^{1} 1单位: 1 ^{1} 1中山大学, 2 ^{2} 2香港中文大学深圳校区论文标题:NavigateDiff: Visual Predictors are Ze…...
Java 与 LibreOffice 集成开发指南
1. 引言 Java 与 LibreOffice 的集成开发为开发者提供了一种强大的工具,用于实现文档自动化处理、文档转换、内容编辑等任务。通过 Java 调用 LibreOffice 提供的 API,可以实现跨平台的文档处理功能,满足各种业务需求。本文将详细介绍如何使…...