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

通过指针引用字符串详解,以及字符指针变量和字符数组的比较

在平常的案例中已大量地使用了字符串,如在 printf函数中输出一个字符串。这些字符串都是以直接形式 (字面形式) 给出的,在一对双引号中包含若干个合法的字符。在本节中将介绍使用字符串的更加灵活方便的方法:通过指针引用字符串

目录

一、字符串的引用方式

1.1引入

二、字符指针作函数参数

2.1举例说明

2.2程序改进

三、使用字符指针变量和字符数组的比较


一、字符串的引用方式

1.1引入

在 C 程序中,字符串是存放在字符数组中的。想引用一个字符串,可以用以下两种方法。

(1)用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明 “ %s ” 输出该字符串。

举例:定义一个字符数组,在其中存放字符串 " I love China! " ,输出该字符串和第8个字符。

#include <stdio.h>
int main()
{char string[] = "1 love China!";	//定义字符数组stringprintf("%s\n", string);				//用%s格式声明输出string,可以输出整个字符串printf("%c\n", string[7]);			//用%c格式输出一个字符数组元素return 0;
}

运行结果:

程序分析:

在定义字符数组 string 时未指定长度,由于对它初始化,因此它的长度是确定的,长度应为14,其中 13 个字节存放 " l love China! " 13个字符,最后一个字节存放字符串结束符 '\0'。数组名 string  代表字符数组首元素的地址。题目要求输出该字符串第 8 个字符,由于数组元素的序号从 0 起算,所以应当输出 string[7],它代表数组中序号 7 的元素的值(它的值是字母 C )。实际上 string[7] 就是 *(string+7),string+7 是一个地址,它指向字符 “ C ”。

(2)用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。

举例:通过字符指针变量输出一个字符串。

#include <stdio.h>
int main()
{char* string = "1 love China!";		//定义指针变量stringprintf("%s\n", string);				//用%s格式输出整个字符串printf("%c\n", *(string + 7));		//用%c格式输出一个元素return 0;
}

运行结果:

程序分析:

在程序中没有定义字符数组,只定义了一个 char* 型的指针变量(字符指针变量) string,用字符串常量 " I love China! " 对它初始化。C 语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量,但是这个字符数组是没有名字的,因此不能通过数组名来引用,只能通过指针变量来引用。

对字符指针变量 string 初始化,实际上是把字符串第 1 个元素的地址(即存放字符串的字符数组的首元素地址)赋给指针变量 string,使 string 指向字符串的第 1 个字符,由于字符串常量 " I love China! " 已由系统分配在内存中连续的 14 个字节中,因此,string 就指向了该字符串的第一个字符。在不致引起误解的情况下,为了简便,有时也可说 string 指向字符串 " I love China! " ,但应当理解为 “ 指向字符串的第 1 个字符 ”。

注意:

string 被定义为一个指针变量,基类型为字符型。请注意它只能指向一个字符类型数据,而不能同时指向多个字符数据,更不是把 " I love China! " 这些字符存放到 string 中(指针变量只能存放地址),也不是把字符串赋给 *string。只是把 " I love China! " 的第 1 个字符的地址赋给指针变量。

%s 是输出字符串时所用的格式符,在输出项中给出字符指针变量名 string,则系统会输出 string 所指向的字符串第 1 个字符,然后自动使 string 加 1,使之指向下一个字符,再输出该字符……如此直到遇到字符串结束标志 '\0' 为止。在内存中,字符串的最后被自动加了一个 '\0' ,因此在输出时能确定输出的字符到何时结束。

说明:

通过字符数组名或字符指针变量可以输出一个字符串,而对一个数值型数组,是不能企图用数组名输出它的全部元素的。

例如:

int a[10];
...
printf("%d\n",a);

是不行的,它输出的是数组首元素的地址。对于数值型数组的元素值只能逐个输出。

举例:将字符串 a 复制为字符串 b,然后输出字符串b。

#include <stdio.h>
int main()
{char a[] = "I am a student.", b[20];//定义字符数组int i;for (i = 0; *(a + i) != '\0'; i++)*(b + i) = *(a + i);			//将a[i的值赋给b[i*(b + i) = '\0';					//在b数组的有效字符之后加'\0'printf("string a is:%s\n", a);	    //输出a数组中全部有效字符printf("string b is:");for (i = 0; b[i] != '\0'; i++)printf("%c", b[i]);				//逐个输出b数组中全部有效字符printf("\n");return 0;
}

运行结果:

程序分析:

程序中 a 和 b 都定义为字符数组,今通过地址访问其数组元素。在 for 语句中,先检查 a[i] 是否为 '\0' ( a[i] 是以 *(a+i) 形式表示的)。如果不等于 '\0',表示字符串尚未处理完,就将 a[i] 的值赋给b[i],即复制一个字符。在 for 循环中将 a 串中的有效字符全部复制给了 b 数组。最后还应将 '\0' 复制过去,作为字符串结束标志。

在第 2 个 for 循环中输出 b 数组中的元素,在 printf 函数中用下标法表示一个数组元素(即一个字符)。也可以用输出 a 数组的方法输出b数组。用以下一行代替程序的10-13行。

printf("string b is:%s\n”,b);

程序中用逐个字符输出的方法只是为了表示可以用不同的方法输出字符串。

也可以用另一种方法:用指针变量访问字符串。通过改变指针变量的值使它指向字符串中的不同字符。

举例:用指针变量来处理问题。

#include<stdio.h>
int main()
{char a[] = "I am a boy.", b[20], * pl, * p2;pl = a; p2 = b;					//pl, p2分别指向a数组和b数组中的第一个元素for (; *pl != '\0'; pl++, p2++)	//pl,p2每次自加1*p2 = *pl;					//将pl所指向的元素的值赋给p2所指向的元素*p2 = '\0';						//在复制完全部有效字符后加'\0'printf("string a is:%s\n", a);	//输出a数组中的字符printf("string b is:%s\n", b);	//输出b数组中的字符return 0;
}

运行结果:

程序分析:

p1 和 p2 是指向字符型数据的指针变量。先使 p1 和 p2 分别指向字符串 a 和 b 的第1个字符。*p1 最初的值是字母 'I'。赋值语句 “ *p2 = *p1; ” 的作用是将字符 'I' ( a 串中第 1 个字符)赋给 p2 所指向的元素,即 b[0]。然后 p1 和 p2 分别加 1,分别指向其下面的一个元素,直到 *p1 的值为 '\0' 止。

二、字符指针作函数参数

如果想把一个字符串从一个函数 “传递” 到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。

2.1举例说明

举例:用函数调用实现字符串的复制。

(1)用字符数组名作为函数参数

#include <stdio.h>
int main()
{void copy_string(char from[], char to[]);char a[] = "I am a teacher.";char b[] = "You are a student.";printf("string a=%s\nstring b=%s\n", a, b);printf("\ncopy string a to string b:\n");copy_string(a, b);		                 //用字符数组名作为函数实参printf("string a = % s\nstring b = % s\n", a, b);return 0;
}
void copy_string(char from[], char to[])	//形参为字符数组
{int i = 0;while (from[i] != '\0'){to[i] = from[i];i++;}to[i] = '\0';
}

运行结果:

程序分析:

a 和 b 是字符数组。copy_string() 函数的作用是将 from[i] 赋给 to[i],直到 from[i] 的值等于 '\0' 为止。在调用 copy_string() 函数时,将 a 和 b 第 1 个字符的地址分别传递给形参数组名 from 和  to 。因此 from[i] 和 a[i] 是同一个单元,to[i] 和 b[i] 是同一个单元。程序执行完以后,由于 b 数组原来的长度大于 a 数组,因此在将 a 数组复制到 b 数组后,未能全部覆盖 b 数组原有内容。b 数组最后 3 个元素仍保留原状。在输出 b 时由于按 %s (字符串)输出,遇 '\0' 即告结束,因此第一个 '\0' 后的字符不输出。如果用 %c 逐个字符输出是可以输出后面这些字符的。

(2)用字符型指针变量作实参

#include <stdio.h>
int main()
{void copy_string(char from[], char to[]);	//函数声明char a[] = "I am a teacher.";				//定义字符数组a并初始化char b[] = "You are a student.";			//定义字符数组b并初始化char* from = a, * to = b;					//from指向a数组首元素,to指向b数组首元素printf("string a=%s\nstring b=%s\n", a, b);printf("\ncopy string a to string b:\n");copy_string(from, to);						//实参为字符指针变量printf("string a=%s\nstring b=%s\n", a, b);return 0;
}
void copy_string(char from[], char to[])		//形参为字符数组
{int i = 0;while (from[i] != '\0'){to[i] = from[i];i++;}to[i] = '\0';
}

运行结果:

程序分析:

指针变量 from 的值是 a 数组首元素的地址,指针变量 to 的值是 b 数组首元素的地址。它们作为实参,把 a 数组首元素的地址和 b 数组首元素的地址传递给形参数组名 from 和 to (它们实质上也是指针变量)。

(3)用字符指针变量作形参和实参

#include <stdio.h>
int main()
{void copy_string(char* from, char* to);char* a = "I am a teacher. ";				//a是 char *型指针变量char b[] = "You are a student. ";			//b是字符数组char* p = b;								//使指针变量p指向b数组首元素printf("string a=%s\nstring b=%s\n", a, b);	//输出a串和b串printf("\ncopy string a to string b : \n");copy_string(a, p);							//调用copy_string函数,实参为指针变量printf("string a=%s\nstring b=%s\n", a, b);//输出改变后的a串和b串return 0;
}
void copy_string(char* from, char* to)			//定义函数,形参为字符指针变量
{for (; *from != '\0'; from++, to++){*to = *from;}*to = '\0';
}

运行结果:

程序分析:

形参改用 char* 型变量(即字符指针变量)。在程序(1)和(2)中 copy_string 函数的形参用字符数组名,其实编译系统是把字符数组名按指针变量处理的,只是表示形式不同。copy_string 函数中不是用下标法引用数组元素,而是通过移动指针变量的指向,找到并引用数组元素。

main 函数中的 a 是字符指针变量,指向字符串 "I am a teacher." 的首字符。b 是字符数组,在其中存放了字符串 "You are a student." 。p 是字符指针变量,它的值是 b 数组第一个元素的地址,因此也指向字符串 "You are a student.” 的首字符。copy_string 函数的形参 from 和 to 是字符指针变量。在调用 copy_string 时,将数组 a 首元素的地址传给 from,把指针变量 p 的值(即数组 b 首元素的地址)传给 to。因此 from 指向 a 串的第一个字符 a[0],to 指向 b[0]。在 for 循环中,先检查 from 当前所指向的字符是否为' \0',如果不是,表示需要复制此字符,就执行 “ *to = *from ”,每次将 *from 的值赋给 *to,第 1 次就是将 a 串中第 1 个字符赋给 b 数组的第 1 个字符。每次循环中都执行 “from++” 和 “to++”,使 from 和 to 分别指向 a 串和 b 数组的下一个元素。下次再执行 “ *to = *from ” 时,就将 a 串中第 2 个字符赋给b[1]……最后将 '\0' 赋给 *to,注意此时 to 指向哪个单元。

2.2程序改进

对 copy_string 函数还可以改写得更精练一些,可以作以下一些改动:

(1)将 copy_string 函数改写为

void copy_string(char* from, char* to)
{while ((*to = *from) != '\0'){to++; from++;}
}

在本程序中将 “ *to = *from ” 的操作放在 while 语句括号内的表达式中,而且把赋值运算和判断是否为 '\0' 的运算放在一个表达式中,先赋值后判断。在循环体中使 to 和 form 增值,指向下一个元素……直到 *from 的值为 '\0' 为止。

(2)copy_string 函数的函数体还可以改为

{while ((*to++ = *from++) != '\0');
}

把上面程序的 to++和 from++ 运算与 *to = *from合并,它的执行过程是,先将 *from 赋给 *to,然后使 to 和 from 增值。显然这又简化了。

(3)copy_string 函数的函数体还可以改为

{while (*from!='\0'){*to++ = *from++;}*to != '\0';
}

当 *from 不等于 '\0' 时,将 *from 赋给 *to,然后使 to 和 from 增值。

(4)由于字符可以用其ASCII码来代替

例如,“ ch=' a' ”可用 “ ch= 97 ”代替,“ while(ch!='a') ” 可以用 “ while(ch!=97) ”代替。因此,“ while(*from!='\0') ” 可以用 “ while(*from!=0) ” 代替( '\0' 的 ASCII 代码为 0 )。而关系表达式 “ *from!=0 ” 又可简化为 “ *from ”,这是因为若 *from 的值不等于0,则表达式 “ *from ” 为真,同时 “ *from!=0 ” 也为真。因此 “ while(*from!=0) ” 和 “ while(*from) ”是等价的。

所以函数体可简化为

{while (*from){*to++ = *from++;}*to != '\0';
}

(5)上面的 while 语句还可以进一步简化为

	while (*to++ = *from++);

它与下面的语句等价

	while ((*to++ = *from++) != '\0');

(6)函数体中也可以改为只用一个 for 语句

	for (; (*to++ = *from++) != '\0'; );

	for (; *to++ = *from++; );

(7)也可以用字符数组名做函数形参,在函数中另定义两个指针变量p1,p2。函数 copy_string 可写为

void copy_string(char from[], char to[])
{char* pl, * p2;pl = from; p2 = to;while ((*p2++ = *pl++) != '\0');
}

以上各种用法,使用十分灵活,程序精练,比较专业,初学者看起来不太习惯,觉得含义不直观。初学者要很快地写出它们可能会有些困难,也容易出错。但应能看懂以上的用法。在对C熟练后,以上形式的使用是比较多的。

归纳起来,用字符指针作为函数参数时,实参与形参的类型有以下几种对应关系

实参形参
字符数组名字符数组名
字符数组名字符指针变量
字符指针变量字符指针变量
字符指针变量字符数组名

三、使用字符指针变量和字符数组的比较

用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。

(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第 1 个字符的地址),绝不是将字符串放到字符指针变量中。

(2)赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。

(3)初始化含义。数组可以在定义时对各元素赋初值,但不能用赋值语句对字符数组中全部元素整体赋值。

	char str[14] = "1 love China!";

不等价于

	char str[14];str[] = "1 love China!";	//把字符串赋给数组中的各元素,错误

(4)存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元( Visual C++为指针变量分配 4 个字节)。

如果定义了字符数组,但未对它赋值,这时数组中的元素的值是不可预料的。可以引用(如输出)这些值,结果显然是无意义的,但不会造成严重的后果,容易发现和改正。

(5)指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。

(6)字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。

(7)引用数组元素。对字符数组可以用下标法(用数组名和下标)引用一个数组元素(如 a[5] ),也可以用地址法 ( 如 *(a+5) ) 引用数组元素 a[5]。如果定义了字符指针变量 p,并使它指向数组 a 的首元素,则可以用指针变量带下标的形式引用数组元素 ( 如 p[5] ),同样,可以用地址法(如 *(p+5) )引用数组元素 a[5]。

(8)用指针变量指向一个格式字符串,可以用它代替 printf 函数中的格式字符串。

	char* format;format = "a=%d,b=%f\n";		//使format指向一个字符串printf(format, a, b);

它相当于

	printf("a= %d,b=%f\n", a, b);

因此只要改变指针变量 format 所指向的字符串,就可以改变输入输出的格式。这种 printf 函数称为可变格式输出函数。

相关文章:

通过指针引用字符串详解,以及字符指针变量和字符数组的比较

在平常的案例中已大量地使用了字符串&#xff0c;如在 printf函数中输出一个字符串。这些字符串都是以直接形式 (字面形式) 给出的&#xff0c;在一对双引号中包含若干个合法的字符。在本节中将介绍使用字符串的更加灵活方便的方法&#xff1a;通过指针引用字符串。 目录 一、…...

Vue基本整合(一)

NPM安装npm是node的包管理工具https://nodejs.org/en/脚手架安装npm i -g vue/clihttps://registry.npmjs.org/vue浏览器插件https://devtools.vuejs.org/guide/installation.html#chromehttps://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhble…...

C++编程之 万能引用

万能引用是一种可以同时接受左值或右值的引用&#xff0c;它的形式是T&&&#xff0c;其中T是一个模板参数。万能引用不是C的一个新特性&#xff0c;而是利用了模板类型推导和引用折叠的规则来实现的功能。 模板类型推导 模板类型推导是指在调用一个模板函数时&#x…...

【JavaScript速成之路】JavaScript内置对象--数组对象

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录前言数组对象1&#xff0c;数组类型检测2&#xff0c;数组元素增删3&#xff0c;…...

【华为机试真题详解 Python实现】最差产品奖【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…...

[算法] 二分查找

package com.guigu.search;import java.util.ArrayList; import java.util.Arrays;/*** author: guorui fu* versiion: 1.0* 二分查找 直接适用于已经排序完成的数组*/ public class BinarySearch {public static void main(String[] args) {int arr[] {1,8,8,89,101,1234};Ar…...

HTML面经

1.src与href的区别 src用于替换当前元素&#xff0c;如script标签&#xff0c;img标签等。当html解析到这些标签时&#xff0c;会暂停解析&#xff0c;将指定的资源下载下来&#xff0c;嵌入到所在位置内。href的话则是一个当前页面与引用资源之间的链接&#xff0c;如link标签…...

我的十年编程路 2021年篇

慢慢地&#xff0c;时光走过了8个年头&#xff0c;来到2021年。 站在2021年&#xff0c;回望8年的过往&#xff0c;没有大的起伏和波澜。或许是上天的眷顾&#xff0c;我的事业发展一直都很顺利。当然&#xff0c;弯路也走过一些&#xff0c;而且工作其实挺辗转的&#xff0c;…...

ElasticSearch 8 学习笔记总结(七)

感觉这些东西没必要认真学&#xff0c;了解一下&#xff0c;工作用到再学。 文章目录一、ES8 EQL 介绍二、ES8 EQL基本操作 与 安全检测三、ES SQL操作四、ES SQL与DSL的关系五、ES 常用的SQL操作六、ES datagrip配置ES七、ES8 自然语言处理 NLP八、ES8 性能优化 之 缓存九、ES…...

【云原生】Docker 网络模式详解、容器间网络通信

当项目大规模使用 Docker 时&#xff0c;容器通信的问题也就产生了。要解决容器通信问题&#xff0c;必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术&#xff0c;有很多令人称道的功能&#xff0c;也有着很多不完善的地方&#xff0c;网络方面就是 Docker…...

Java开发 - 布隆过滤器初体验

目录 前言 布隆过滤器 什么是布隆过滤器 布隆过滤器的作用 布隆过滤器原理 怎么设计布隆过滤器 布隆过滤器使用案例 安装布隆过滤器 添加依赖 添加配置 添加工具类 添加测试代码 简单测试 特别提醒​​​​​​​ 结语 前言 前面三篇&#xff0c;已经把消息队列…...

【计算机组成原理 - 第一章】计算机系统概论(完结)

本章参考王道考研相关课程&#xff1a; 【2021版】1.2.1_计算机硬件的基本组成_哔哩哔哩_bilibili 【2021版】1.2.2_认识各个硬件部件_哔哩哔哩_bilibili 【2021版】1.2.3_计算机系统的层次结构_哔哩哔哩_bilibili 【2021版】1.3_计算机的性能指标_哔哩哔哩_bilibili 目录 一、…...

C++类与对象(下)【详析】

类与对象&#xff08;下&#xff09; 目录类与对象&#xff08;下&#xff09;一、再谈构造函数1.构造函数体赋值2.初始化列表定义&#xff1a;注意点&#xff1a;总结&#xff1a;3.explicit关键字引入&#xff1a;explicit&#xff1a;二、 static成员回顾&#xff1a;static…...

exe反编译为.py文件

介绍公司以前的一个exe包&#xff0c;我们需要查看里面python源码&#xff0c;但是以前的py源码文件找不到&#xff0c;所以只能反编译&#xff0c;介绍一下反编译的过程。首先准备&#xff1a;pyinstxtractor.py这个文件&#xff0c;网上很多&#xff0c;自己下载准备查看二进…...

38 openEuler搭建FTP服务器-FTP总体介绍

文章目录38 openEuler搭建FTP服务器-FTP总体介绍38.1 FTP简介38.2 FTP使用到的端口38.3 vsftpd简介38 openEuler搭建FTP服务器-FTP总体介绍 38.1 FTP简介 FTP&#xff08;File Transfer Protocol&#xff09;即文件传输协议&#xff0c;是互联网最早的传输协议之一&#xff0…...

三天吃透操作系统面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

vue后台管理系统——添加i18n国际化功能——技能提升

昨天在写后台管理系统时&#xff0c;遇到一个需求就是需要实现国际化功能。 antd和element-ui这两个框架其实都是有国际化的。 具体展示形式就是如下&#xff1a; 点击右上角头部的语言&#xff0c;切换语言&#xff0c;然后整个系统的文字都改变成对应的语言展示。 切换成…...

理清gcc、g++、libc、glibc、libstdc++的关系

0 理清gcc、g++、libc、glibc、libstdc++的关系 0.1 $ dpkg -L libc6 $ dpkg -L libc6 /lib/x86_64-linux-gnu /lib/x86_64-linux-gnu/ld-2.31.so /lib/x86_64-linux-gnu/libBrokenLocale-2.31.so /lib/x86_64-linux-gnu/libSegFault.so /lib/x86_64-linux-gnu/libanl-2.31.s…...

一、快速入门 MongoDB 数据库

文章目录一、NoSQL 是什么1.1 NoSQL 简史1.2 NoSQL 的种类及其特性1.3 NoSQL 特点1.4 NoSQL 的优缺点1.5 NoSQL 与 SQL 数据库的比较二、MongoDB 基础知识2.1 MongoDB 是什么2.2 MongoDB 的体系结构2.3 MongoDB 的特点2.4 MongoDB 键特性2.5 MongoDB 的核心服务和工具2.6 Mongo…...

PMP第一章到第三章重要知识点

第1章引论 1.1指南概述和目的 PMBOK指南收录项目管理知识体系中被普遍认可为“良好实践”的那一部分&#xff1a; “普遍认可”&#xff1a;大多数时候适用于大多数项目&#xff0c;获得一致认可。 “良好实践”&#xff1a;能提高很多项目成功的可能性。 全球项目管理业界…...

【事务与锁】当Transactional遇上synchronized

事务与锁 - Transactional与Synchronize&#x1f970;前言问题回放问题一1、代码与结果复现2、原因分析3、解决方法问题二1、问题复现2、原因分析事务Transactional与锁synchronized1、synchronized与Transactional区别2、可能带来的问题3、针对问题二的解决前言 最近工作中遇…...

Pytorch模型转TensorRT步骤

Pytorch模型转TensorRT步骤 yolov5转TRT 流程 当前项目基于yolov5-6.0版本&#xff0c;如果使用其他版本代码请参考 https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5 获取转换项目&#xff1a; git clone https://github.com/wang-xinyu/tensorrtx.git git …...

产品经理入门——必备技能之【产品运营】

文章目录一、基础介绍1.1 用户生命周期 & 产品生命周期1.2 运营的目的1.3 运营的阶段1.4 运营的主要工作&#xff08;海盗模型&#xff09;二、AARRR模型2.1 Acquisition 拉新2.2 Activision 促活2.3 Retention 留存2.4 Revenue 转化2.5 Referral 传播总结产品运营技能是产…...

【Java实现文件上传】java后端+vue前端实现文件上传全过程详解(附源码)

【写在前面】其实这篇文章我早就想写了&#xff0c;只是一直被需求开发耽搁&#xff0c;这不晚上刚好下班后有点时间&#xff0c;记录一下。需求是excel表格的上传&#xff0c;这个是很多业务系统不可或缺的功能点&#xff0c;再此也希望您能够读完我这篇文章对文件上传不再困惑…...

什么是SSD?SSD简述

什么是SSD&#xff1f;SSD简述前言一. SSD组成二. SSD存储介质存储介质按材料不同可分为三大类&#xff1a;光学存储介质、半导体存储介质和磁性存储介质三. SSD接口形态固态硬盘有SATA 3.0接口、MSATA接口、M.2接口、PCI-E接口、U.2接口五种类型。三. SSD闪存颗粒分类闪存颗粒…...

MySQL基础------sql指令1.0(查询操作->select)

目录 前言&#xff1a; 单表查询 1.查询当前所在数据库 2.查询整个表数据 3.查询某字段 4.条件查询 5.单行处理函数&#xff08;聚合函数&#xff09; 6.查询时给字段取别名 7.模糊查询 8.查询结果去除重复项 9.排序&#xff08;升序和降序&#xff09; 10. 分组查询 1…...

Python数据分析处理报告--实训小案例

目录 1、实验一 1.1、题目总览 1.2、代码解析 2、实现二 2.1、题目总览 2.2、代码解析 3、实验三 3.1、题目总览 3.2、代码解析 4、实验四 3.1、题目总览 3.2、代码解析 哈喽~今天学习记录的是数据分析实训小案例。 就用这个案例来好好巩固一下 python 数据分析三…...

OpenCV入门(十二)快速学会OpenCV 11几何变换

OpenCV入门&#xff08;十二&#xff09;快速学会OpenCV 11几何变换1.图像平移2.图像旋转3.仿射变换4.图像缩放我们在处理图像时&#xff0c;往往会遇到需要对图像进行几何变换的问题。图像的几何变换是图像处理和图像分析的基础内容之一&#xff0c;不仅提供了产生某些图像的可…...

小菜鸟Python历险记:(第二集)

今天写的文章是记录我从零开始学习Python的全过程。Python基础语法学习&#xff1a;Python中的数值运算一共有7种&#xff0c;分别是加法&#xff08;&#xff09;、减法&#xff08;-&#xff09;、除法&#xff08;/&#xff09;得到的结果是一个浮点数、乘法&#xff08;*&a…...

ContentProvider程序之间数据的相互调用

1权限的获取和调用 权限分为普通权限和危险权限&#xff0c;除了日历信息&#xff0c;电话&#xff0c;通话记录&#xff0c;相机&#xff0c;通讯录&#xff0c;定位&#xff0c;麦克风&#xff0c;电话&#xff0c;传感器&#xff0c;界面识别&#xff08;Activity-Recognit…...

wordpress首页优化/seo在线优化

不久前刚买了新的笔记本&#xff0c;要在Win7下重新安装JDK&#xff08;java开发工具&#xff09;以及IDE&#xff08;集成开发环境&#xff09;,于是顺便把安装过程记录下来。 第一步&#xff1a;下载JDK JDK下载网址&#xff1a;http://www.oracle.com/technetwork/java/java…...

网站改版 请示/网址提交入口

部署在linux上的java程序&#xff0c;有时更新了包&#xff0c;忘记了是否执行了重启&#xff0c;此时有必要根据java进程的启动时间和包的更新时间来确定。 1. 查看Linux进程的启动时间 # ps axo pid,ppid,comm,pmem,lstartPID PPID COMMAND %MEM …...

网络服务商能删除网站/seo兼职接单平台

服务器电源管理系统SPM(Server Power Management)随着信息设备的进一步集中&#xff0c;更多的数据中心被建立。新一代数据中心对供电系统的可靠性及可管理性要求越来越高。IT用户需要对信息设备的供电系统进行更可靠与更灵活的配电、更精细化的管理、更准确的成本消耗等。艾默…...

微网站定制/产品软文模板

RPM安装 1、卸载mariadb rpm -e mariadb-libs 5.5.56-2.el7.x86_642、在官网下载Mysql-5.6.32-1.l7.x86_64.rpm-bndle.tar 3、解压 tar xvf Mysql-5.6.32-1.l7.x86_64.rpm-bndle.tar4、 yum install Mysql-client-5.6.32-1.l7.x86_64.rpmyum install Mysql…...

案例模板我的网站/优化网站排名解析推广

偷渡用户直接更新是无法更新的 3.0.1.57 &#xff1a;https://www.123pan.com/s/VZiA-gvBVh 提取码:ig5D 3.0.2.68&#xff1a;https://pan.quark.cn/s/3e169c4e40d4 下载最新版安装包放到桌面&#xff0c;然后打开cmd&#xff0c;输入命令&#xff1a; start 文件路径 /I st…...

佛山顺德容桂网站制作/seo虚拟外链

一、在项目的根目录下新建external文件夹 二、将你要导入的包放入external文件夹 三、在你要导入的包的根目录内&#xff0c;执行go mod init example.com/xxx/xxx&#xff0c;把包名替换为你自己的&#xff1b; 四、打开你项目的go.mod文件&#xff0c;引入你要引入的包&am…...