C语言-指针讲解(4)

news2025/2/26 3:36:54

在上一篇博客中:
C语言-指针讲解(3)
我们给大家介绍了指针进阶的用法
让下面我们来回顾一下讲了什么吧:
1.字符指针变量类型以及用法
2.数组指针本质上是一个指针,里面存放数组的地址。而指针数组本质上是个数组,里面存放的是指针,指向的是整型数组。
以及数组指针变量的用法。
3.二维数组传参的本质:

  • 二维数组起始可以看做每个元素是一维数组的数组,也就是二维数组的每个元素是一个一维数组。
  • 二位数组的数组名表示的就是第一行的地址,是一维数组的地址。
  • 二维数组传参传参本质也是传递了地址,传递的是第一行这个一维数组的地址。

4.函数指针以及函数指针变量的用法和举例
5.函数指针数组的概念以及函数指针数组的用法。
6.用函数指针数组作为转移表来实现整个计算器的代码逻辑。



那么这次博主将更为深层的介绍指针的高级用法,具体内容如下:
在这里插入图片描述
在这里插入图片描述

文章目录

  • 1.回调函数
    • 1.1 回调函数是什么?
    • 1.2 回调函数举例
      • 代码改进:
  • 2.qsort使用举例
    • 2.1 qsort函数的参数详解:
      • 2.1.1 qsort函数中的第一个参数重点介绍
      • 2.1.2 qsort函数中的第四个参数重点介绍
    • 2.2 qsort 函数用法举例
      • 2.2.1qsort 函数用法举例1:
      • 2.2.1qsort 函数用法举例2:
    • 2.2.1通过vs调试窗口观看qsort排序前后的结果:
  • 3. qsort函数的模拟实现
    • 3.1参数部分改变
    • 3.2改造比较方法
    • 3.3改造两个数交换部分
  • 4.模拟实现qsort函数源代码展示:
  • 5.用模拟实现的qsort函数对数据进行排序
    • 5.1 用模拟实现的qsort函数对数组进行升序或降序的操作动图演示:
    • 5.2 用模拟实现的qsort函数对结构体类型的数字排序动图演示:

1.回调函数

1.1 回调函数是什么?

回调函数就是一个通过函数指针调用的函数。
如果我们把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行相应。

1.2 回调函数举例

在这里插入图片描述
如下所示:
在这里插入图片描述
1.2.1回调函数应用和代码分析:

我们在上一篇博客:C语言-指针讲解(3)
中。
已经讲过红色框中的代码是重复出现的,虽然里面执行计算的逻辑是区别的,但是输入输出操作时冗余的,有没有办法可以简化一些呢?

答案是有的。

代码改进:

我们发现红色框中的代码,只有调用函数的逻辑是有差异的,我们可以把调用的函数的地址以参数的形式传递过去,然后使用函数指针接收,函数指针指向的函数就调用什么函数,这里其实使用的就是回调函数的功能。

2.qsort使用举例

在介绍qsort函数之前,我们首先分享一个查阅C/C++库函数的网站给大家:
C/C++库函数官网查询

2.1 qsort函数的参数详解:

如下图所示:
在这里插入图片描述

通过上图的分析,我们发现qsort中的第二、三个参数都是比较常见的。那我们就重点介绍第一个参数和第四个参数吧。

2.1.1 qsort函数中的第一个参数重点介绍

根据上图的介绍,我们不难看出qsort第一个参数的意思是base指向待排序的第一个元素。但是为什么它前面的类型是void*呢?很多同学可能对此不理解。
下面我来重点介绍一下为什么是前面的类型是void *?
在这里插入图片描述

如下图所示:
在这里插入图片描述

  • 比方说:我这里要定义了一个a的变量,而如果说我用char* 的指针变量来接收a的地址,显然是不合理的,因为vs弹出警告说:int * 到 char * 的类型不兼容。
  • 反倒void* 是一个通用的指针类型。它可以接受任意数据类型的地址。因此前面的指针类型我们是可以写成void*的。
  • 需要注意的是:虽然说这里void * 的指针可以接受任意数据类型的地址,但是呢它还是具有一定的局限性,比方说:我们从上图发现虽然void * 的指针拿到任意数据类型的地址,但是它始终是个无类型的指针,因此我们如果对void*的变量1或-1要访问多少个字节我们是不知道的,同样的道理;我们对它进行解引用操作访问多少个字节,这个也是不知道的。因此像这种写法在vs编译器上是会报错的,所以对于void * 的指针,它只是用来存放地址的,我们可以把任意类型的地址放到void * ,但是void * 的变量不能进行+1,-1,以及解引用的操作。

那这时,可能有同学会想为什么qsort这个函数别人要设计成void*的指针呢?

这是因为,我们知道,qsort这个函数是库函数实现的。

  • 我们也可以做个比喻:实现那个代码的人叫程序员A,比方说他设计好这个函数,让我们这些同学以及开发者和全世界的人去使用,但是程序员A,但是他不能预料到别人要用qsort这个函数要排什么类型的数据。
  • 比如张三的要用qsort排整型的数据,李四要用qsort来排浮点型的数据,王五要用qsort来排字符串型的数据,甚至有人用qsort来排结构体类型的数据,而结构体类型的数据又被称作为自定义类型的数据。就是我们排什么类型的元素都行,只需把排序的第一个元素的地址传给qsort就行。因为qsort它不知道排什么类型,但是我们把它的地址放到void是不是就行,因为void的指针是可以接受任意类型的地址。

2.1.2 qsort函数中的第四个参数重点介绍

如下图所示:
在这里插入图片描述

我们之前也对qsort这个函数的第4个参数有所了解,本质就是指向的函数能够比较两个元素。

在这里插入图片描述

当然呢,如果我们对第四个参数有更深的理解,我们会发现通过qsort内部去调用指针所指向那个的函数从而比较这两个元素的,并且我们发现这个函数指针返回的值是int型的,因此它们是通过比较两个元素的大小从而确定返回的值是大于0,是等于0,还是小于0?
举个例子:

  • 如果p1指向元素的值要比p2指向元素的指向的值要大,返回的是1个大于0的数。
  • 如果p1指向元素的值要跟p2所指向的元素的值相等,返回的是0。
  • 如果p1所指向的元素要比p2所指向的元素要相小,则返回的是小于0的数。

2.2 qsort 函数用法举例

2.2.1qsort 函数用法举例1:

这里我们演示一下用qsort函数对数组以升序的方式进行排序。

//这个函数能够比较e1和e2指向的两个元素,并且给出返回值
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

//test1测试qsort排序整型数组
void test1()
{
	int arr[] = { 3,1,5,7,2,4,8,6,0,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}

int main() {
	
	test1();
	return 0;
}

这里可能有同学对于下面这行代码不太理解,博主这里就解释一下吧:

return *(int*)e1 -*(int*)e2;

分析

  • 我们知道cmp_int是个函数指针类型,然后它这个cmp_int 函数指针参数部分e1和e2是个void *的指针,首先我们假设e1存放的是3的地址,而e2存放的是1的地址,那如何比较比较它们的大小呢?其实很简单,我们只需在e1前面加上个 * ,e2前面加上个 * 。
    也是就:
    *e1, *e2这样子。
  • 但是那个e1和e2都是void * 的指针,这样是不能直接比较它们的大小的,我们要通过对这e1和e2强转为int * 的指针,然后再对它进行解引用操作,这样比较两个元素的大小。这是什么原理呢?这是因为qsort函数的使用者博主,现在我确实知道当我们排序拿出这组数据的时候,如果cmp_int来比较这两个整型的话。e1指向的是整型,e2指向的是整型,那我们要拿出整型的值,将e1和e2转为整型指针后再解引用,是不是就拿到呢
  • 另外,当我们拿到这两个元素的数据,如果要比较这两个数的大小,那我们只需返回e1-e2的值即可。

这里需要注意的是:

  • qsort函数中的第四个参数不一定只是调用了一次cmp_int函数,有可能是调用了多次cmp_int函数。 另外,qsort里面有复杂的代码,它目前对于大家来讲相当于一个黑箱子,大家都不知道里面是怎么实现的,但博主接下来会给大家演示如何模拟实现一个qsort函数。
  • 另外,qsort函数第排序的过程中是需要比较大小的,这个可能很多人会有点懵,因为我们排出它的顺序是需要比较大小的,如果我们不知道这些元素的大小是不能对它进行排序的。

我们不妨用vs来运行一下此程序,看看能否把数组中的数字以升序的形式排列出来~
如下图所示:
在这里插入图片描述

当然,如果有同学比较好奇,想用qsort函数实现降序的效果,那我们就把cmp_int函数返回值由e1-e2改成e2-e1即可。

也就是这样子,如下所示:
在这里插入图片描述
在这里插入图片描述

2.2.1qsort 函数用法举例2:

当然,我们也可以用qsort函数来排序结构体的数据。
如下所示:

//test2测试qsort函数排序结构体数据
struct Stu //学生
{
	char name[20];//名字
	int age;//年龄
};

//假设按照年龄来比较
int cmp_stu_by_age(const void* e1, const void* e2) {

	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}



//strcmp - 是库函数,是专门用来比较两个字符串的大小的
//假设按照名字来比较
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}

void test2()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	//qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

int main()
{
	test2();
	return 0;
}

这里可能有同学对qsort排序结构体的数据不理解,没有关系,博主后期的博客会继续深入介绍C语言结构体方面的知识,大家尽情关注一下哈,目前我们只是看一下qsort排序结构体数据后的结果哦~

2.2.1通过vs调试窗口观看qsort排序前后的结果:

这里我们通过放两个动图:一个是按照结构体年龄的数据来排的动图,一个是按照结构体名字的数据来排的动图。

动图一:
在这里插入图片描述
这是我们根据结构体年龄升序排列的动图效果。

动图2:
在这里插入图片描述
这是我们根据结构体名字的顺序来升序排列的动图效果。

这里可能有些同学对这个名字排序有点疑惑,为什么lisi的名字是最小的,而zhangsan这个名字是最大的?

  • 这是因为这里的名字进行比较本质上就是每个名字中的第一个字符进行比较,如果说这三个名字中的第一个字符都相等,它就会进行这三个名字中的第二个字符进行比较。直到这三个名字中的第n个字符各不相同,那么这时就能分出哪个字符大,哪个字符小。 就无需对这三个名字的第n往后的字符进行比较。
    在这里插入图片描述
  • 从上图的ASCLL码表我们可以得知:显然这三个名字中的首字符z最大,l最小。那么就无需对这三个名字中的第二个字符进行比较。 也就是说我们可以得出以下结论:
    lisi<wangwu<zhangsan

另外,我们讲一下,这里讲的qsort函数其实用的是快速排序的思想,大家如果感兴趣的可以学一下。

3. qsort函数的模拟实现

这里呢,博主给大家演示用qsort函数来模拟实现一个冒泡排序。
首先呢,我们先给大家看一下普通冒泡排序的代码:

#include <stdio.h>
void Bubblesort(int arr[], int sz) {
	//趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++) {

		int j = 0;
		for (j = 0; j < sz - 1 - i; j++) {
			if (arr[j + 1] < arr[j]) {
				int tmp = arr[j+1];
				arr[j + 1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}
void print_arr(int arr[], int sz) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
}
//
int main() {

	int arr[] = { 3,1,5,6,9,0 ,15};
	int sz = sizeof(arr) / sizeof(arr[0]);
	Bubblesort(arr, sz);
	print_arr(arr, sz);

	return 0;
}

代码分析及其优化:
但是我们发现这个代码局限性比较小,只能对整型进行排序,而如果说我们要对浮点型,字符型,结构体类型进行排序,显然是不可行的?
那我们要怎么优化这个程序呢?

如下图所示:

如上图所示,我们发现如果要对这个整型冒泡排序算法改成能够排序任意类型元素的算法。就要做出这三种改变

  • 改造参数 - 让这个函数能够接受任意类型的数据
  • 改造比较方法 - 让函数能够在排序时,比较不同类型的数据
  • 两个数交换部分要改变

3.1参数部分改变

首先,如果把参数部分改变,就要改成跟qsort参数类型是一样的。
如下代码所示:

void Bubble_sort(void* base, size_t sz, size_t width, int (*Cmp_int)(const void* e1, const void* e2))

3.2改造比较方法

  • 首先,我们要调用它的Bubble_sort函数中的第四个参数:int (* Cmp_int)(const void* e1, const void* e2)来作为判断条件来比较,因为这个函数指针Cmp_int本质上就是通过指向比较两个元素的函数的指针。重复调用此函数来比较两个元素。而这里,我们假设判断它是否为升序数组:我们就要判断e1-e2是否>0,如果是返回的大于0的数,则交换;反之,则不交换。根据上面的介绍,那个if语句我们可以写成这样:
if(Cmp_int()>0);

那Cmp_int函数的参数类型我们可以写成什么呢?

  • 我们发现,这里的参数部分可以写成两个比较元素的地址,因为只要把元素的地址传给Cmp_int函数,然后通过调用这个函数,返回的值如果是e1>e2,就要对这两个元素的值进行交换。

那我们应该怎么改呢?

  • 我们可以把代码这样,如下所示:
if (Cmp_int((char*)base + j * width, (char*)base + (j + 1) * width) > 0)

有同学可能不知道为什么要这么改?我们来解释一下把:

如下图所示:在这里插入图片描述
从上图,我们发现,如果我们要找到数组中5的地址,就要跳过2 * width字节,就是跳过2个这么宽的元素;
而如果说要找到数组中的2的地址,就要跳过3 * width个字节。就相当于跳过3个这么宽的元素,这是因为base指针指向的是数组首元素的地址,而width表示的是一个元素类型所占的大小,只有知道一个元素类型的大小,才能访问到它后面元素的地址。 那么照这个规律,我们推而广之,就能得出下面这个式子

(char*)base + j * width;

既然跳过两个整型元素,就是2 * width,那跳过j个整型元素,就是j * width;而跳过(j+1)整型元素就是(j+1) x width。那最终我们条件判断就可以写成这样:

if (Cmp_int((char*)base + j * width, (char*)base + (j + 1) * width) > 0)

需要注意的是,这里的base由void *强转为char * 。是因为char * 是只占一个字节,只有char * 类型才能保证一个一个字节一个字节走的,只有这样才能j * width具体能控制哪个元素

3.3改造两个数交换部分

当我们改造好比较方法后,接下来就要对两个数交换部分进行比较,这个也是比较简单,我们可以封装一个Swap函数,把那两个比较元素的地址以及宽度width作为参数部分传过去。
代码如下:

Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);

这里会有同学会有疑问,为什么传的是要传width这个参数给Cmp_int函数呢

  • 因为如果是单单传这两个元素参数过去的话,我们是不知道这两个元素有多大的,因为我们在排序过程中,这个冒泡排序程序压根不知道排的是什么类型的数据,它只知道交换的是两个元素的起始地址,因此这里要把它们交换几个字节搞上去。
  • 另外当我们进入Swap函数内部,我们形参还是用char *指针的方式来接收,方便之后的交换操作。
    在这里插入图片描述
    根据上图,我们发现当我们要对5和2这两个数字进行交换的话,就要对它们每组的字节数进行交换,并且我们发现这些数字在vs内存中是以十六进制,并且倒着放来进行存储的
    如下图所示:
    在这里插入图片描述
    那如果我们要对这两个数进行交换的话,我们是一对字节一对字节地交换,因为它是个char * 的指针。交换完之后buf和buf2进行++的操作,找到下一个字节进行交换,它这里width总共是占4个字节,因此要交换4次就能完成交换的操作。

Swap函数内部代码如下:

void Swap(char* buf1, char* buf2, size_t width) {
	int i = 0;
	for (i = 0; i < width; i++) {
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}

}

如上代码: 我们不难看出,当for循环结束的时候,2和5这两个数字的一组中的字节数全都进行了交换。
综上所述:我们发现以一对字节一对字节地交换非常适用在这种场景下的,反之,不能直接在Swap函数内部创建临时变量来交换数据,比方说:整型占4个字节,浮点型也占4个字节。这种情况下,即使Swap这个函数根据该数据类型的字节数还是不能准确知道它传的数据类型是什么,而用char *的方式创建临时变量,它每次只会交换两个十六进制数,也就是1个字节。这样我们根据width参数所占的字节数,一对字节一对字节地交换能够很好地控制所要交换的次数

在这里插入图片描述

4.模拟实现qsort函数源代码展示:

下面是博主模拟实现qsort源代码:

//程序员A,设计一个qsort函数功能,能够排序任意类型的数据
int Cmp_int(const void* e1, const void* e2) {

	return (*(int*)e1 - *(int*)e2);
}


void Swap(char* buf1, char* buf2, size_t width) {

	int i = 0;
	for (i = 0; i < width; i++) {
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}

}

void Bubble_sort(void* base, size_t sz, size_t width, int (*Cmp_int)(const void* e1, const void* e2)) {

	int i = 0;
	
	for (i = 0; i < sz - 1; i++) {

		int j = 0;
		for (j = 0; j < sz - 1 - i; j++) {

			if (Cmp_int((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
				//为什么要强转为char*,因为char*是占一个字节,只有char才能保证一个字节一个字节走的,只有这样,才能控制j*witdh具体能控制哪个元素
				{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
				}
		}
	}
}

如果大家有需要的话实现对任意数据类型进行排序的话,可以借鉴一下博主模拟实现qsort函数的代码哦!

5.用模拟实现的qsort函数对数据进行排序

下面博主以动图的方式给大家演示用模拟实现的qsort函数对数据进行排序。

5.1 用模拟实现的qsort函数对数组进行升序或降序的操作动图演示:

1.数组升序:
在这里插入图片描述
2.数组降序
在这里插入图片描述

5.2 用模拟实现的qsort函数对结构体类型的数字排序动图演示:

按结构体的名字排序:
在这里插入图片描述
按结构体的年龄排序:
在这里插入图片描述

** 好了,今天的分享到这就结束了,如果觉得博主讲得有些知识点不太清楚的话,可以在评论区指出**
在这里插入图片描述
** 如果觉得博主讲得还不错的话,希望大家一键三连支持一下!谢谢大家!!!**

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

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

相关文章

【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.1---9.1.3)

目录 9.1 类和对象的基本概念 9.1.1 类的封装性 9.1.2 定义类的步骤和方法 9.1.3 设计一个学生类 Student 9.1 类和对象的基本概念 9.1.1 类的封装性 类是一种用户自定义的数据类型&#xff0c;它定义了一组数据成员和成员函数。类可以看作是一个模板或者蓝图&#xff0c;用…

党建引领·和谐共建——赤岗街首届微型社区养老服务公益博览会开幕

服务咨询平台&#xff0c;让社区长者更便捷地了解到养老相关政策、信息。 本次活动由赤岗街公共卫生委员会、赤岗街道办事处、中国老龄事业发展基金会老年维权基金管理委员会主办&#xff0c;珠影社区居委会、广州市穗星社会工作服务中心、广州市盈泽信息科技有限公司承办&…

生成对抗网络(DCGAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、创建模型1. 生成器2. 判别器 四、定义损失函数和优化器1. 判别器损失2. 生成器损失 五、定义训练循环六、训练模型七、创建 G…

Amazon CodeWhisperer 使用体验

文章作者&#xff1a;STRIVE Amazon CodeWhisperer 是最新的代码生成工具&#xff0c;支持多种编程语言&#xff0c;如 java,js,Python 等&#xff0c;能减少开发人员手敲代码时间&#xff0c;提升工作效率。PS:本人是一名 CodeWhisperer 业余爱好者 亚马逊云科技开发者社区为开…

Spring Cloud 配置 Nacos

一&#xff0c;下载Nacos 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 二&#xff0c;启动Nacos 安装Nacos的bin目录下&#xff0c; 执行&#xff1a;startup.cmd -m standalone 然后打开上图红框的地址 三&#xff0c;配置服务 1 配置Nacos 创建命名…

【C++】异常抛出变量的生命周期

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

[Android] c++ 通过 JNI 调用 JAVA函数

如何使用&#xff1a; Calling Java from C with JNI - CodeProject c里的 JNI 类型 和 JAVA 类型的映射关系&#xff1a; JNI Types and Data Structures Primitive Types and Native Equivalents Java TypeNative TypeDescriptionbooleanjbooleanunsigned 8 bitsbytejbyt…

高级java工程师手把手教你解决内存不足引起JVM奔溃真实生产事故案例实战

高级java工程师手把手教你解决内存不足引起JVM奔溃案例实战 一、真实事故描述&#xff1a; 生产环境的Java程序进程&#xff0c;直接宕掉&#xff0c;进程都没有了&#xff0c;JVM奔溃了。生产事故&#xff0c;生产直接停止了&#xff0c;甲方爸爸客户着急了&#xff0c;公司…

使用yolov7进行多图像视频识别

1.yolov7你可以让你简单的部署,比起前几代来说特别简单 #下面是我转换老友记的测试视频,可以看到几乎可以准确预测 2.步骤 1.在github官网下载代码 https://github.com/WongKinYiu/yolov7 2.点击下载权重文件放到项目中 3.安装依赖,我的python版本是3.6的 pip install -r requ…

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别&#xff1a; 1、left join 就是“左连接”&#xff0c;表1左连接表2&#xff0c;以左为主&#xff0c;表示以表1为主&#xff0c;关联上表2的数据&#xff0c;查出来的结果显示左边的所有数据&#…

如何从初级进阶中级测试工程师?测试人该具备哪些素养?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、如何成为一枚中…

JAVA全栈开发 day14_集合(Collection\List接口、数据结构、泛型)

一、数组 数组是一个容器&#xff0c;可以存入相同类型的多个数据元素。 数组局限性&#xff1a; ​ 长度固定&#xff1a;&#xff08;添加–扩容&#xff0c; 删除-缩容&#xff09; ​ 类型是一致的 对象数组 &#xff1a; int[] arr new int[5]; … Student[] arr …

分享88个清新唯美PPT,总有一款适合您

分享88个清新唯美PPT&#xff0c;总有一款适合您 88个清新唯美PPT下载链接&#xff1a;https://pan.baidu.com/s/1XUUjxjmWFw2fJKENjk6_Yg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

【亚马逊云科技】re:Invent 2023 | Amazon Q王炸产品震撼来袭

re:Invent 2023前沿资讯快速入口➡️&#xff1a;2023亚马逊云科技reinvent大会&#xff0c;与开发者一起构建未来&#xff01; 文章目录 一、2023 亚马逊云科技 re:Invent 精彩内容速递&#x1f3a8;二、Amazon Q 震撼来袭2.1 什么是Amazon Q&#xff1f;2.2 Amazon Q功能介绍…

OpenHarmony 关闭息屏方式总结

前言 OpenHarmony源码版本&#xff1a;4.0release 开发板&#xff1a;DAYU / rk3568 一、通过修改系统源码实现不息屏 修改目录&#xff1a;base/powermgr/power_manager/services/native/profile/power_mode_config.xml 通过文件中的提示可以知道DisplayOffTime表示息屏的…

wordpress安装之Linux ftp传输

工欲善其事,必先利其器。 最近准备在自己的服务器上搭建一个个人技术分享的平台。 因为我发现现在网络上的工具呀&#xff0c;还有一些问题的解答总是模棱两可&#xff0c;所以我打算自己做一个。 首先呢&#xff0c;我们需要有一个linxu的系统当服务器&#xff0c;然后呢&a…

d3dcompiler_47.dll缺失怎么修复?一招搞定电脑弹窗问题

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“d3dcompiler_47.dll缺失”。这个错误通常出现在游戏或应用程序运行时&#xff0c;它会导致程序无法正常启动或运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复缺失的文件。…

带米勒钳位的隔离驱动SiLM5350系列 工作原理、特性参数、封装形式

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V&#xff0c;10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 描述&#xff1a; SiLM5350系列是单通道隔离驱动器&#xff0…

2023年中国数据要素市场研究报告

第一章 概况 1.1 定义 中国数据要素交易市场是一个多层次、多维度的复杂体系&#xff0c;涵盖了不同的交易方式、市场类型和行业应用。数据要素作为一种新兴的生产要素&#xff0c;涉及社会经营活动中所有可以电子化记录、为使用者或所有者带来经济效益的数据资源。 在狭义上…

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…