【C语言】第八期——指针、二维数组与字符串

news2025/3/1 4:41:46

目录

1 初始指针

2 获取变量的地址

3 定义指针变量、取地址、取值

3.1 定义指针变量

3.2 取地址、取值

4 对指针变量进行读写操作

5 指针变量作为函数参数

6 数组与指针

6.1 指针元素指向数组

6.2 指针加减运算(了解)

6.2.1 指针加减具体数字 

6.2.2 指针加减指针

6.3 数组名与数组元素首地址的关系

6.4 数组作为函数参数

7 二维数组以及字符串与指针

7.1 二维数组的定义方法

7.1.1 定义一个二维数组 

7.1.2 访问二维数组

7.2 定义字符串的几种方法

7.3 字符串数组

7.4 strcat 连接字符串

7.5 strcpy 字符串复制(拷贝)函数


1 初始指针

通过前面的教程我们知道变量是用来存储数据的,变量的本质是给存储数据的内存地址起了一个好记的别名

比如我们定义了一个变量 int a= 10 ,这个时候可以直接通过a这个变量来读取内存中保存的10 这个值,在计算机底层a这个变量其实对应了一个内存地址

指针也是一个变量,但它是一种特殊的变量,它存储的数据不是一个普通的值,而是另一个变量的内存地址

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表 示了在内存中的一个地址

刚开始学C语言的指针操作,我们只需要记住两个符号 :&(取地址) 和 *(根据地址取值 /定义指针变量)


2 获取变量的地址

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。C语言中使用&字符放在变量 前面对变量进行取地址操作

#include <stdio.h>
int main(void)
{
	int a = 10;
	printf("a的地址是:%p\n", &a);
	return 0;
}

3 定义指针变量、取地址、取值

3.1 定义指针变量

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type *var-name;

在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。用 来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是 指针

以下是有效的指针声明:

int* ip;    //一个整型的指针
double* dp; //一个 double 型的指针
float* fp;  //一个浮点型的指针
char* ch    //一个字符型的指针

所有指针的值都是一个地址,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是 一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同


3.2 取地址、取值

#include <stdio.h>
int main(void)
{
	// 定义一个int变量a
	int a = 10;
	printf("a的地址是:%p\n", &a);
	// 定义int类型的指针变量p
	int* p_a = &a;
	printf("指针p_a的值:%p\n", p_a);
	printf("指针p_a的地址:%p\n", &p_a);
	printf("a的值:%d\n", a);
	printf("根据指针p_a的值去内存取值得到的结果为:%d", *p_a);
	return 0;
}

总结:

  • 取地址操作符&和取值操作符是一对互补操作符, & 取出地址, 根据地址取出地址指向的值
  • 对变量进行取地址(&)操作,可以获得这个变量的地址
  • 指针变量的值是地址
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值

4 对指针变量进行读写操作

#include <stdio.h>
int main(void)
{
	int a = 10;
	int b = 20;
	int* p1, * p2; // 定义指针变量 p1、 p2
	p1 = &a;
	// p1 指向变量 a
	p2 = p1;
	// p2 指向变量 a
	printf("&a=%p p1=%p p2=%p\n", &a, p1, p2);
	*p1 = 20;
	printf("a的值%d,取指针得到的值%d", a, *p1);
	return 0;
}

运行结果:

&a=000000612A17FA74 p1=000000612A17FA74 p2=000000612A17FA74
a的值20,取指针得到的值20


5 指针变量作为函数参数

在C语言中,函数参数不仅可以是字符型、整型、浮点型等,还可以是指针类型,作用是将变量地址传递给函数形参

#include <stdio.h> 
void modify1(int *c) 
{
	*c = 20;
}
int main(void) {
	int a = 10;
	modify1(&a);
	printf("%d", a);
	return 0;
}

6 数组与指针

6.1 指针元素指向数组

数组本质上是一片连续的内存空间,每个数组元素都对应一块独立的内存空间,它们都有相应的地址。

因此,指针变量既然可以指向变量,也就可以指向数组元素

数组的构成本质上是:数组名[偏移量]

数组名就代表第一个元素的地址,偏移量就是在此基础上偏移

数组的元素本质上完全可以当做是单独的变量对待,只不过没有名称而已

int a[5]={1,2,3,4,5}; //定义长度为5的int数组
int *p_a=&a[0]; //定义指向int变量的指针变量p_a,把a数组第0个元素地址赋给指针变量p_a

注意:&a[0]等价于&(a[0]),由于[ ]运算符比取地址运算符&优先级高,因此&(a[0])中的小括号可以省略,简写为:&a[0]

在计算机中内存的最小单位是字节,每个字节都对应一个地址

如果一个变量占用多个字节,就会占用 多个内存地址

例如: char 类型变量占1字节就对应1个地址,short 类型变量占2字节对应2个地址,int 类型变量占4 字节对应4个地址.....·其他类型依次类推

同理,数组元素类型不同占用的内存地址也不同

下面通过例子来验证以上分析

#include<stdio.h>
int main(void)
{
	char c[5];
	short s[5];
	int i;
	for (i = 0; i < 5; i++)
	{
		printf("&c[%d]=%p ", i, &c[i]);
		printf("&s[%d]=%p \n", i, &s[i]);
	}
	return 0;
}

运行结果:

&c[0]=000000000061FE17 &s[0]=000000000061FE0C

&c[1]=000000000061FE18 &s[1]=000000000061FE0E

&c[2]=000000000061FE19 &s[2]=000000000061FE10

&c[3]=000000000061FE1A &s[3]=000000000061FE12

&c[4]=000000000061FE1B &s[4]=000000000061FE14

说明:不同设备上面输出的地址可能不一样的,数组中每个元素地址都是连续的


6.2 指针加减运算(了解)

6.2.1 指针加减具体数字 

指针本质上就是内存地址,在32 位操作系统下,内存地址是 4 字节的整数。既然是整数就可以进行 加、减、乘、除等算术运算。不过需要注意的是,在 C 语言中一般只讨论指针加、减运算,乘、除等其 他算术运算都没有意义

在实际开发中,指针加、减运算多用于数组(或连续内存空间)。当指针变量p 指向数组元素时,p+1 表 示指向下一个数组元素,p-1 表示指向上一个数组元素

#include <stdio.h>
int main(void)
{
	int a[3] = { 1, 2, 3 };
	int* p = &a[0];// 指针 p 指向 a[0]
	printf("%p %d\n", p, *p); // 输出 a[0] 的地址 和 a[0] 的值
	
	p = p + 1;// p 加 1
	printf("%p %d\n", p, *p); // 输出 a[1] 的地址 和 a[1] 的值
	return 0;
}

运行结果:

000000811557F968 1
000000811557F96C 2

注意:实现指针加减的时候需要注意越界问题


6.2.2 指针加减指针

在C语言中,两个指针相加是没有意义的,而两个指针相减却有特殊的意义,不过只有当两个指针都指向同一数组中的元素时才有意义

一个数组中的元素时,对它们进行减法运算,得到的结果是这两个指针所指向元素之间相隔的元素个数 (不是之间有的个数,之间有的元素数要在此基础上减一),而不是它们地址差值的字节数。其计算方式是用两个指针的地址差值除以指针所指向数据类型的大小

用公式表示为:(指针2的地址 - 指针1的地址) / sizeof(指针所指向的数据类型)


6.3 数组名与数组元素首地址的关系

C语言中,数组名与数组首元素地址等价。也就是说,在程序中,输出数组名与输出数组首元素地址是相同的

#include <stdio.h>
int main(void)
{
    int num[5];
    printf("%p\n", num);     // 输出数组名
    printf("%p\n", &num[0]); // 输出数组首元素地址
    return 0;
}

输出结果:

000000000061FE00

000000000061FE00

我们就可以通过把数组名复制给指针变量,来把数组首地址给指针变量

#include <stdio.h>
 int main(void)
 {
    int num[5] = {1, 2, 3, 4, 5};
    int *p_num = num; // 把num的首地址赋值给指针变量
    printf("p_num指针的值=%p \n p_num对应数组元素的值%d", p_num, *p_num);
    return 0;
 }

我们也可以通过p_num来访问数组里面的每个元素

 #include <stdio.h>
 int main(void)
 {
    int num[5] = {1, 2, 3, 4, 5};
    int *p_num = num; // 把num的首地址赋值给指针变量
    printf("p_num指针的值=%p ,num的地址是=%p  p_num对应数组元素的值%d\n", p_num, num, 
*p_num);
    printf("p_num访问第一个元素=%d\n", p_num[0]);
    printf("p_num访问第二个元素=%d\n", p_num[1]);
    return 0;
 }

运行结果:

p_num指针的值=000000000061FE00 ,num的地址是=000000000061FE00  p_num对应数组元素的值1

p_num访问第一个元素=1 p_num访问第二个元素=2


6.4 数组作为函数参数

函数参数不仅可以是变量,也可以是数组,数组作函数参数的作用是将数组首元素地址传给函数作形参。 在 C 语言中,数组作函数参数时,是没有副本机制的,只能传递地址。也可以认为,数组作函数参数时,会退化为指针

#include <stdio.h>
void getSize(int nums[10]) // 定义 getSize 函数
{
	int size = sizeof(nums); // 计算数组 nums 的总字节数
	printf("指针 size=%d\n", size);
}
int main(void)
{
	int nums[10] = { 1, 2, 3, 4, 5 };
	int size = sizeof(nums); // 计算数组 nums 的总字节数
	printf("外部 size=%d\n", size);
	getSize(nums); // 调用 getSize 函数
	return 0;
}

 运行结果:

外部 size=40

指针 size=8

所以直接把函数的形参的类型设置为指针,来接收数组的第一个地址: 

#include <stdio.h>
void getSize(int* nums) // 定义 getSize 函数
{
	int size = sizeof(nums); // 计算数组 nums 的总字节数
	printf("指针 size=%d\n", size);
}
int main(void)
{
	int nums[10] = { 1, 2, 3, 4, 5 };
	int size = sizeof(nums); // 计算数组 nums 的总字节数
	printf("外部 size=%d\n", size);
	getSize(nums); // 调用 getSize 函数
	return 0;
}

运行结果:

外部 size=40

指针 size=8

分析:

32位系统中指针变量占4个字节,64位系统中指针变量占8个字节,所以getSize中num的字节数是8。在 C 语言中,数组作函数参数时,是没有副本机制的,只能传递地址,所以 的形参 int *nums应该是指针变量, void getSize方法 getSize(nums) 传入的nums并不是数组的副本,而是数组首元素的地址 

注意:因为没有副本机制,所以如果在函数内部修改数组内容,数组的内容会直接被修改,而不是修改副本

#include <stdio.h>
void getSize(int* nums) // 定义 getSize 函数
{
	nums[0] = 3;
}
int main(void)
{
	int nums[10] = { 1, 2, 3, 4, 5 };
	printf("%d\n", nums[0]);    //加\n是为了换行
	getSize(nums); // 调用 getSize 函数
	printf("%d", nums[0]);
	return 0;
}

练习:封装比较数组最大值函数

#include <stdio.h>
int getMax(int* nums, int length) // 定义函数 getMax
{
	int i;
	int max = nums[0]; // 默认 nums[0] 为最大值
	for (i = 1; i < length; i++) // 下标从 1 开始遍历
	{
		if (max < nums[i]) // 比较大小
		{
			max = nums[i]; // 覆盖最大值
		}
	}
	return max; // 返回最大值
}


int main(void)
{
	int nums[10] = { 11, 22, 3, 24, 15, 8, 99, 21, 35, 0 };
	int length = sizeof(nums) / sizeof(nums[0]); // 计算数组长度
	int max = getMax(nums, length); // 返回最大值
	printf(" 最大值为 :%d\n", max);
	return 0;
}

7 二维数组以及字符串与指针

7.1 二维数组的定义方法

C语言中二维数组和一维数组类似,简单理解就是:二维数组由多个一维数组构成

7.1.1 定义一个二维数组 

type arrayName[x][y];

例:

int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};

内部嵌套的括号是可选的,下面的初始化与上面是等同的:

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

7.1.2 访问二维数组

#include <stdio.h>
#include <string.h>
void main(void)
{
	int a[3][4] = { {1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23} };
	printf("a[0][2]=%d", a[0][2]);
}

运行代码:

a[0][2]=5


7.2 定义字符串的几种方法

我们已经学习的定义方法:

#include <stdio.h>
int main(void)
{
	char chs1[] = { 'i', 't', 'y', 'i', 'n', 'g', '\0' };
	char chs2[] = "itying";
	printf("%s\n", chs1);// 以 %s 格式输出 str
	printf("%c\n", chs1[2]); // 以 %c 格式输出一个字符
	printf("%s\n", chs2);  // 以 %s 格式输出 str
	printf("%c", chs2[2]); // 以 %c 格式输出一个字符
	return 0;
}

我们也可以使用字符指针引用字符串:

#include <stdio.h>
int main(void)
{
	char chs1[] = "itying";
	char* str1 = chs1;
	printf("%s\n", str1);  // 以 %s 格式输出 str
	printf("%c\n", str1[2]);   // 以 %c 格式输出一个字符
//---------------------------------------------------------------------------
	char* str2 = "this is str";
	printf("%s\n", str2);  // 以 %s 格式输出 str
	printf("%c\n", str2[2]); // 以 %c 格式输出一个字符
	return 0;
}

通过上面示例我们可以通过三种方法定义字符串了

char chs1[] = {'i', 't', 'y', 'i', 'n', 'g', '\0'};
char chs2[] = "itying";
char *chs3 = "itying";

7.3 字符串数组

定义了一个指针数组,即数组中的每个元素都是一个 char 类型的指针:

char *arr[] 

例:

char *s[]={ "马总", "张总", "王麻子" };

当使用 { "马总", "张总", "王麻子" } 对这个数组进行初始化时,会把每个字符串常量的首字符地址分别赋给数组 arr 的各个元素:

  • arr[0] 被赋值为字符串 "马总" 的首字符地址,通过这个指针,就可以访问该字符串的所有字符
  • arr[1] 被赋值为字符串 "张总" 的首字符地址
  • arr[2] 被赋值为字符串 "王麻子" 的首字符地址

    在实际处理中文时,通常会使用多字节字符编码,比如常见的 UTF - 8 编码或 GBK 编码

    UTF - 8 是一种变长编码,一个中文字符通常用 3 个字节来表示。对于字符串 "张总",“张” 字在 UTF - 8 编码下会占用 3 个字节的存储空间,arr[1] 指向的就是这 3 个字节中第一个字节的存储地址


    7.4 strcat 连接字符串

    前面我们已经学习了 strlen 计算字符串数组有效长度、sprintf 字符串格式化函数、字符串拼接、整型转换成字符串等字符串知识,详细见【C语言】第七期——字符数组、字符串、类型转换

    现在我们继续学习相关知识

    原型:

    char *strcat(char *dest, const char *src);    //使用前需先引入头文件<string.h>

    参数:

    • dest:目标字符串的指针,拼接后的结果将存储在这个字符串中。dest 必须有足够的空间来容纳 src 字符串的内容以及拼接后的结果
    • src:源字符串的指针,它将被追加到 dest 字符串的末尾。src 字符串本身不会被修改

    返回值:

    函数返回一个指向目标字符串 dest 的指针

    工作原理:

    strcat 函数会从 dest 字符串的第一个空字符 '\0' 开始,将 src 字符串的内容复制到 dest 的末尾,直到遇到 src 字符串的空字符 '\0' 为止,最后,dest 字符串会以空字符 '\0' 结尾

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        // 定义目标字符串和源字符串
        char dest[50] = "Hello, ";
        const char src[] = "World!";
    
        // 使用 strcat 函数将 src 追加到 dest 的末尾
        strcat(dest, src);
    
        // 输出结果
        printf("拼接后的字符串: %s\n", dest);
    
        return 0;
    }

    注意事项:

    • 内存空间:dest 数组必须有足够的空间来容纳 src 字符串的内容,否则会导致缓冲区溢出,这可能会引发程序崩溃或安全漏洞
    • 空字符:dest 字符串必须以空字符 '\0' 结尾,否则 strcat 函数无法确定从哪里开始追加
    • 字符串重叠:dest 和 src 所指向的字符串不能重叠,否则会导致未定义行为

    7.5 strcpy 字符串复制(拷贝)函数

    原型:

    char *strcpy(char *dest, const char *src);

    参数:

    • dest:指向目标字符数组的指针,用于存储复制后的字符串。目标数组必须有足够的空间来容纳源字符串及其终止的空字符 '\0'
    • src:指向源字符串的指针,即要被复制的字符串。该参数被声明为 const,表示在函数内部不会修改源字符串

    返回值:

    strcpy 函数返回指向目标字符数组 dest 的指针

    工作原理:

    strcpy 函数会将 src 指向的字符串(包括终止的空字符 '\0')复制到 dest 指向的字符数组中

    复制过程会一直进行,直到遇到源字符串的终止空字符 '\0',并将该空字符也复制到目标数组中

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        // 定义源字符串
        char src[] = "Hello, World!";
        // 定义目标字符数组,确保有足够的空间
        char dest[20];
    
        // 使用 strcpy 函数复制字符串
        strcpy(dest, src);
    
        // 输出复制后的字符串
        printf("Copied string: %s\n", dest);
    
        return 0;
    }

    注意事项:

    • 缓冲区溢出风险:使用 strcpy 时需要确保目标数组有足够的空间来容纳源字符串及其终止空字符,否则可能会导致缓冲区溢出,引发未定义行为,为了避免这种风险,可以使用更安全的 strncpy 函数
    • 目标数组的初始化:在使用 strcpy 之前,不需要对目标数组进行初始化,因为 strcpy 会覆盖目标数组中的原有内容

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307709.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    Spring Boot集成Spring Security之HTTP请求授权

    一、HTTP请求授权工作原理 ​ 基于Spring Security最新的Http请求授权讲解&#xff0c;不再使用旧版的请求授权 授权过滤器AuthorizationFilter获取认证信息 调用RequestMatcherDelegatingAuthorizationManager的check方法验证该用户是否具有该请求的授权 RequestMatcherDele…

    可以免费无限次下载PPT的网站

    前言 最近发现了一个超实用的网站&#xff0c;想分享给大家。 在学习和工作的过程中&#xff0c;想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量&#xff0c;但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…

    从零开始自主「起身站立」,上海AI Lab发布最新控制算法,机器人:起猛了

    来源 | 机器之心 近日&#xff0c;上海 AI Lab 具身智能中心研究团队在机器人控制领域取得了最新突破&#xff0c;提出的 HoST&#xff08;Humanoid Standing-up Control&#xff09;算法&#xff0c;成功让人形机器人在多种复杂环境中实现了自主站起&#xff0c;并展现出强大…

    Solr中得Core和Collection的作用和关系

    Solr中得Core和Collection的作用和关系 一&#xff0c; 总结 在Apache Solr中&#xff0c;Core和Collection 是两个核心概念&#xff0c;他们分别用于单机模式和分布式模式&#xff08;SolrCloud&#xff09;中&#xff0c;用于管理和组织数据。 二&#xff0c;Core 定义&am…

    AI驱动的自动化留给人类的时间不多了

    时间紧迫&#xff01;时间紧迫&#xff01;时间紧迫&#xff01; 关于AI工作流催生的行业任务自动化时间窗口&#xff0c;结合技术成熟度、成本效益、行业特性等维度&#xff0c;可划分为以下阶段&#xff1a; 一、技术渗透阶段&#xff08;2025-2028年&#xff09; 高重复性任…

    使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

    在 Kubernetes 1.24及以上版本环境中&#xff0c;docker不再被支持&#xff0c;主要使用Containerd 是常用的容器运行。默认情况下&#xff0c;Containerd 使用 HTTPS 协议与镜像仓库通信。然而&#xff0c;在某些场景下&#xff08;如测试环境或内部网络&#xff09;&#xff…

    Dify在Ubuntu20.04系统的部署

    文章目录 一、dify 介绍1.核心功能优势2.应用场景 二、dify 安装(docker方式)1.代码库下载2.配置文件修改3.启动docker 容器 三、遇到问题与解决1.使用sudo docker compose up -d报错2.使用service docker start报错 一、dify 介绍 Dify 是一款开源的大语言模型&#xff08;LL…

    达梦:内存相关参数

    目录 28个相关参数1. 内存池相关MEMORY_POOLMEMORY_N_POOLSMEMORY_BAK_POOL 2. 大缓冲区相关HUGE_BUFFERHUGE_BUFFER_POOLS 3. 共享缓冲区相关BUFFERBUFFER_POOLSBUFFER_MODEMAX_BUFFER 4. 快速池相关FAST_POOL_PAGES 5. 回收池相关RECYCLE_POOLS 6. 回滚段池相关ROLLSEG_POOLS…

    计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)

    博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

    《Qt动画编程实战:轻松实现头像旋转效果》

    《Qt动画编程实战&#xff1a;轻松实现头像旋转效果》 Qt 提供了丰富的动画框架&#xff0c;可以轻松实现各种平滑的动画效果。其中&#xff0c;旋转动画是一种常见的 UI 交互方式&#xff0c;广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…

    SpringBoot3—快速入门

    一、简介 &#xff08;1&#xff09;前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA &#xff08;2&#xff09;环境要求 &#xff08;3&#xff09;SpringBoot3是什么 核心概念&#xff1a;Spring Boot 底层是 Spring&#xff0c;能简单、快速地创建一个独立的、生…

    Python基于机器学习的微博舆情情感分析系统,微博评论情感分析可视化系统(全新升级)

    大家好&#xff0c;今天为大家带来的是Python基于机器学习的微博舆情情感分析系统&#xff0c;微博评论情感分析可视化系统&#xff0c;这个系统在原本的系统上进行优化升级。 算法从开源框架的 snlow &#xff0c;到支持机器学习的 lstm 算法可以手动输入语句&#xff0c;进行…

    Matlab地图绘制教程第2期—水陆填充图

    上一期分享了海岸线图的绘制方法&#xff1a; 本着由浅入深的理念&#xff0c;本期再来分享一下水陆填充图的绘制方法。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab地图绘制教程系列&#xff0c;旨在降低大家使用Matlab进行地图类科研绘图的门槛&#xff0c;…

    云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书

    云创智城YunCharge 新能源充电行业系统说明书 ⚡官方文档 ⚡官网地址 1. 引言 随着全球环境保护和能源危机的加剧&#xff0c;新能源汽车行业得到了快速发展&#xff0c;充电基础设施建设也随之蓬勃发展。新能源充电行业系统旨在提供高效、便捷的充电服务&#xff0c;满足电…

    (八)Java-Collection

    一、Collection接口 1.特点 Collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object&#xff1b; 有些Collection的实现类&#xff0c;可以存放重复的元素&#xff0c;有些不可以&#xff1b; 有些Collection的实现类&#xff0c;有些是有序的&#xff08;Li…

    小程序高度问题背景scss

    不同的机型&#xff0c;他的比例啥的都会不一样&#xff0c;同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…

    Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)

    漏洞简介&#xff1a; Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境&#xff1a; 春秋云镜中的漏洞靶标&#xff0c;CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…

    基于Spark的电商供应链系统的设计与实现

    目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 &#xff08;一&#xff09;分布式计算系统Spark &#xff08;二&#xff09;数据仓库Hive &#xff08;三&#xff09;读取服务器本地磁盘的日志数据Flume &#xff08;四&#xff09;分布式消息队列Kafka …

    从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(二)

    1.安装mogondb数据库 参考MongoDB安装配置教程&#xff08;详细版&#xff09;_mongodb安装详细步骤-CSDN博客 安装mondbcompass数据库连接工具 参考https://www.mongodb.com/zh-cn/docs/compass/current/connect/ 2.后端服务 1.创建src文件夹 并在src文件夹下创建 index…

    server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)

    从你提供的配置文件&#xff08;应该是 Spring Boot 的 application.yml 或 application.properties 文件&#xff09;来看&#xff0c;以下部分与会话超时时间相关&#xff1a; server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…