C++指针(四)

news2025/1/17 13:57:26

个人主页:PingdiGuo_guo

收录专栏:C++干货专栏

前言

相关文章:C++指针(一)、C++指针(二)、C++指针(三)

本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。

点赞破六十,更新下一期哟!

文章目录

前言

1.函数指针

1.1函数指针的概念

1.2函数指针的作用

1.3函数指针的使用

1.3.1定义

1.3.2初始化

1.3.2调用函数

1.3.3比较函数指针

1.4函数指针的练习

2.函数指针数组

2.1函数指针数组的作用

2.2函数指针数组的使用

2.2.1 定义

2.2.2 初始化

2.2.3 调用

2.2.4 传参

2.3函数指针二维数组

2.4函数指针数组的练习

3.回调指针

3.1回调指针的用处

3.2回调指针的使用

3.2.1 定义函数原型

3.2.2 声明变量

3.2.3定义

3.2.4 地址传递

3.2.5调用

4.指针函数

4.1指针函数的作用

4.2指针函数的操作

4.2.1 声明

4.2.2 定义

4.2.3 调用

4.2.4返回

4.3指针函数的练习

总结


1.函数指针

大家可能在学习了指针后有这样的疑惑:哎,既然数组有地址,变量有地址,那函数会不会也有地址呀?是的,函数也有地址,请看下面一段代码:

​
#include <bits/stdc++.h>
using namespace std;
void te()
{
	printf("hello!\n");
}
int main()
{
	printf("%p\n", te);
	printf("%p\n", &te);
	return 0;
}

​

输出结果:

函数地址:函数名、&函数名

可要储存怎么办呢?别急,接下来我们要讲的函数指针就是用来存储函数的地址的。

1.1函数指针的概念

函数指针是指可以指向函数的变量。它存储了函数的地址,可以通过函数指针调用对应的函数。在C和C++等编程语言中,函数被编译为一段机器码,该机器码位于内存的某个地址上。函数指针就是存储这个地址的变量,它允许我们通过指针来直接调用对应的函数。

1.2函数指针的作用

函数指针可以用于以下几个方面:

1.回调函数:当一个函数需要在某个事件发生时调用另一个函数时,可以使用函数指针来实现回调函数。比如,当一个操作完成时,可以调用预先设置的回调函数来处理操作结果。

2.排序和搜索算法:函数指针可以用于排序和搜索算法中,通过传递一个比较函数给算法,实现不同的排序顺序或搜索条件。

3.动态库加载:函数指针可以用于加载动态库中的函数。通过函数指针,可以在运行时动态地加载和使用库中的函数。

4.多态性:函数指针可以用于实现多态性,允许在运行时确定要调用的具体函数。

总而言之,函数指针可以增强程序的灵活性,使其能够根据特定的条件或需求选择不同的函数进行调用。这在设计可扩展和可重用的代码时非常有用。

1.3函数指针的使用

1.3.1定义

在C++中,可以通过以下两种方式定义函数指针:

1.使用typedef关键字定义函数指针类型,然后使用该类型定义函数指针变量。例如:

typedef void (*FuncPtr)(int);  // 定义函数指针类型
FuncPtr fnPtr;  // 定义函数指针变量

2.直接使用函数指针的语法定义函数指针变量。例如:

void (*fnPtr)(int);  // 定义函数指针变量

3.使用using关键字来定义。例如:

using FnPtr = void (*)(int);  // 定义函数指针类型FnPtr

以上三种方式都定义了一个指向形参为int类型,返回类型为void的函数指针。

注:这里我们需要加上两个括号,它们表示fnPtr是一个函数指针变量,指向一个参数为int类型的函数。

1.3.2初始化

关于函数指针的初始化,我们可以直接赋值给一个已有函数的地址。例如:
 

void myFunction(int x) {
    // 函数体
}

void (*fnPtr)(int);  // 定义函数指针变量

fnPtr = &myFunction;  // 将myFunction函数的地址赋值给fnPtr

在C++中,可以使用取地址运算符&来获取函数的地址,也可以省略取址运算符直接赋值给函数指针变量。另外,使用using关键字定义的函数指针类型可以提高代码的可读性。

对了,在输出函数指针时需要注意,在C++中,函数指针的打印输出不会直接显示函数的地址,而是显示为1。因为C++中的函数指针是一种可调用类型,可以像函数一样进行调用,因此在进行输出时,函数指针会被隐式地转换为一个bool值,而非函数的内存地址。如果想要获得函数的地址,可以使用reinterpret_cast将函数指针转换为void*类型,然后进行打印输出。如下所示:
 

cout << reinterpret_cast<void*>(fnPtr) << endl;  // 输出函数指针fnPtr所指向的函数的地址

这样,我们将得到正确的函数地址的输出。

接下来,我们就可以输出函数的地址了!如下:

1.3.2调用函数

我们可以通过函数指针直接调用相应的函数。例如,假设有一个函数指针fnPtr,可以使用(*fnPtr)(参数列表)的方式调用函数。

void myFunction(int x) {
    // 函数体
}

int main() {
    void (*fnPtr)(int) = myFunction;  // 定义函数指针并初始化

    // 调用函数
    (*fnPtr)(10);

    return 0;
}

1.3.3比较函数指针

我们可以使用函数指针进行比较操作,判断两个函数指针是否相等。函数指针相等表示两个函数指向同一个函数。

#include<bits/stdc++.h>
using namespace std;

void myFunction1(int x) {
    // 函数体
}

void myFunction2(int x) {
    // 函数体
}

int main() {
    void (*fnPtr1)(int) = myFunction1;  // 定义函数指针1并初始化
    void (*fnPtr2)(int) = myFunction2;  // 定义函数指针2并初始化

    // 比较函数指针
    if (fnPtr1 == fnPtr2) {
        cout<<"ok"<<endl;
    } else {
        cout<<"no"<<endl;
    }
    
cout << reinterpret_cast<void*>(fnPtr1) << endl;// 输出函数指针fnPtr所指向的函数的地址
cout << reinterpret_cast<void*>(fnPtr2) << endl; // 输出函数指针fnPtr所指向的函数的地址



    return 0;
}

结果:

1.4函数指针的练习

题目:编写一个程序,计算三角形的面积。利用函数指针来选择计算面积的方法。

步骤:
1. 声明一个函数指针,指向一个计算面积的函数。
2. 编写一个计算面积的函数,该函数接受三个参数表示三角形的边长,并返回计算得到的面积。
3. 编写第二个计算面积的函数,该函数接受两个参数表示三角形的底和高,并返回计算得到的面积。
4. 编写主函数,在其中通过用户输入选择计算面积的方法。
5. 在主函数中,根据用户选择的方法,使用函数指针调用相应的计算面积的函数,并输出结果。

知识点:
1. 函数指针的声明和使用。
2. 函数的定义和调用。
3. 三角形面积的计算方法。

三角形面积的计算方法有两种,一个是三边法,采用的是海伦公式,另一个是底高法,也就是公式面积=底*高/2。

流程图:
 


开始
声明函数指针
定义计算面积函数1
定义计算面积函数2
接收用户输入选择方法
根据选择使用函数指针调用相应函数
输出结果
结束

代码:

#include <iostream>

using namespace std;

// 声明函数指针
typedef double (*AreaFunc)(double, double);

// 计算面积的函数1:三边法
double calcAreaBySide(double a, double b, double c) {
    double s = (a + b + c) / 2;
    return sqrt(s * (s - a) * (s - b) * (s - c));
}

// 计算面积的函数2:底高法
double calcAreaByBaseHeight(double base, double height) {
    return 0.5 * base * height;
}

int main() {
    int choice;
    double a, b, c, base, height;
    AreaFunc areaFunc;

    cout<<"选择方法:"<<endl;
    cin >> choice;

    switch (choice) {
        case 1:
            areaFunc = calcAreaBySide;
            cout << "三角形的三边长度:" << endl;
            cin >> a >> b >> c;
            cout << "三角形的面积为:" << areaFunc(a, b, c) << endl;
            break;
        case 2:
            areaFunc = calcAreaByBaseHeight;
            cout << "三角形的底和高:" << endl;
            cin >> base >> height;
            cout << "三角形的面积为:" << areaFunc(base, height) << endl;
            break;
        default:
            cout << "无效" << endl;
            break;
    }

    return 0;
}

本示例中,通过函数指针 AreaFunc 来选择使用不同的计算面积的函数。用户可以通过输入选择三边法或底高法来计算三角形的面积,程序会根据选择来调用相应的计算函数并输出结果。

2.函数指针数组

既然有函数指针,那肯定也有函数指针数组啦!函数指针数组是一个数组,每个成员都是一个函数指针。

2.1函数指针数组的作用

函数指针数组的作用主要有以下几个方面:

1. 调用不同的函数:函数指针数组可以存储多个函数的指针,通过数组的索引可以选择调用不同的函数。这样可以在运行时根据需要动态地选择不同的函数来执行特定的操作。

2. 函数回调:函数指针数组可以用于实现函数回调的机制。回调函数是指在特定的条件或事件发生时,通过函数指针来调用事先定义好的函数。通过函数指针数组,可以在需要的时候选择合适的回调函数进行调用。

3. 状态机:函数指针数组可以用于实现状态机的机制。状态机是一种表示状态和状态转换的模型,通过函数指针数组可以将每个状态定义为一个函数,使用数组索引进行状态转换。

4. 函数指针数组作为参数传递:函数指针数组可以作为参数传递给其他函数,以便在函数内部使用。这样可以将一组相关的函数作为整体传递,方便对这组函数进行统一的操作或处理。

总之,函数指针数组提供了一种灵活、动态和可扩展的方式来管理和调用函数,使得程序可以根据需要选择不同的函数进行执行,增强了程序的灵活性和可维护性。

2.2函数指针数组的使用

在C++中,函数指针数组的操作与C类似,但可以使用更具有面向对象特性的方式。

2.2.1 定义

使用typedef关键字可以简化函数指针类型的定义,使代码更具可读性。
 

typedef void (*FuncPtr)(int);  // 定义函数指针类型

FuncPtr func_ptr_array[N];  // 定义大小为N的函数指针数组

2.2.2 初始化

可以直接在定义函数指针数组时给出初始值,或通过循环赋值操作为数组元素赋予特定的函数指针。这里介绍在定义函数指针数组时给出初始值和数组元素赋予特定的函数指针这两种方法。

void func1(int);
void func2(int);

FuncPtr func_ptr_array[] = {func1, func2};  // 初始化函数指针数组

func_ptr_array[0] = func1;  // 为函数指针数组赋值
func_ptr_array[1] = func2;

2.2.3 调用

这里我们可以使用数组的索引来选择并调用函数指针数组中的函数。

int index = 0;//索引
func_ptr_array[index](10);  // 调用函数指针数组中索引为0的函数,并传入参数10


2.2.4 传参

这里同样可以将函数指针数组作为参数传递给其他函数,在函数内部使用。

void process_func_array(FuncPtr array[], int size) {
    //函数体......
}

process_func_array(func_ptr_array, 2);  // 将函数指针数组作为参数传递给函数

在C++中,可以使用函数指针数组来实现更加灵活的函数回调机制、策略模式等。此外,C++还提供了更强大的工具,如函数对象、Lambda表达式等,可以替代函数指针数组,在处理函数选择和回调方面更加方便和易用。

2.3函数指针二维数组

函数指针二维数组用于存储多个函数指针,每个函数指针可以指向一个函数。它的定义和使用方式与普通二维数组类似,只是数组元素是函数指针。

函数指针二维数组的定义如下:

typedef returnType (*functionName)(parameter1, parameter2, ...);

functionName arrayName[rowSize][colSize];

其中,returnType 是函数的返回类型,functionName 是函数指针类型的名称,parameter1, parameter2, ... 是函数的参数列表。arrayName 是函数指针二维数组的名称,rowSize 是数组的行数,colSize 是数组的列数。

2.4函数指针数组的练习

题目:编写一个程序,根据输入的年份判断是否为闰年。

步骤:
1. 定义一个函数指针数组,用于存储判断闰年的函数地址。
2. 定义多个判断闰年的函数,如根据公历规则判断、根据儒略历规则判断等。
3. 在主函数中,输入一个年份。
4. 遍历函数指针数组,依次调用判断闰年的函数,并将输入的年份作为参数传递给该函数。
5. 根据函数的返回结果判断是否为闰年,如果是则输出“该年份是闰年”,否则输出“该年份不是闰年”。

知识点:
1. 函数指针数组的定义和使用。
2. 根据输入的年份调用对应的判断闰年函数。
3. 函数的参数传递和返回值。

流程图:

输入一个年份
 |
V
遍历函数指针数组
 |
V
调用判断闰年的函数,将年份作为参数传递
 |
V
根据返回结果判断是否为闰年
 |
V
输出结果

代码:
 

在运行时,程序会要求输入一个年份,然后遍历函数指针数组,依次调用判

#include <iostream>

typedef bool (*leapYearChecker)(int); // 定义函数指针类型

// 根据公历规则判断是否为闰年
bool isLeapYearByGregorian(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        return true;
    } else {
        return false;
    }
}

// 根据儒略历规则判断是否为闰年
bool isLeapYearByJulian(int year) {
    if (year % 4 == 0) {
        return true;
    } else {
        return false;
    }
}

int main() {
    int year;
    
    std::cout << "请输入一个年份:";
    std::cin >> year;
    
    leapYearChecker leapYearCheckers[] = {isLeapYearByGregorian, isLeapYearByJulian}; // 函数指针数组
    
    int numCheckers = sizeof(leapYearCheckers) / sizeof(leapYearCheckers[0]); // 计算数组长度
    
    bool isLeapYear = false;
    
    for (int i = 0; i < numCheckers; i++) {
        isLeapYear = leapYearCheckers[i](year); // 调用判断闰年的函数
        
        if (isLeapYear) {
            std::cout << "该年份是闰年" << std::endl;
            break;
        }
    }
    
    if (!isLeapYear) {
        std::cout << "该年份不是闰年" << std::endl;
    }
    
    return 0;
}

断闰年的函数,并将输入的年份作为参数传递给该函数。根据函数的返回结果判断是否为闰年,并输出相应的结果。

3.回调指针

回调指针是一种特殊的指针,它指向的函数可以在程序运行时作为参数传递给其他函数,并在需要的时候被调用执行。回调指针允许我们在不直接调用函数的情况下,将函数的执行权交给其他函数去处理。

3.1回调指针的用处

回调指针的主要用途是实现回调函数,回调函数是在特定事件或条件发生时被调用的函数。通过使用回调指针,我们可以将函数的执行顺序和逻辑进行灵活的控制,并将特定的操作委托给其他函数来处理。

回调指针的用处包括但不限于以下情况:

1. 事件处理:在图形界面编程中,当用户触发某个事件(如点击按钮)时,可以使用回调指针来指定所需执行的函数,实现对事件的响应。

2. 排序算法:在排序算法中,可以通过回调指针指定不同的比较函数,以实现不同的排序方式。

3. 状态机:在状态机设计中,可以使用回调指针将状态切换函数作为参数传递给状态机,实现对不同状态的处理。

4. 多线程编程:在多线程编程中,可以通过回调指针将某个函数作为线程的入口函数,实现多线程的执行。

通过使用回调指针,我们可以将代码组织得更加模块化和可扩展,提高代码的可读性和可维护性。

3.2回调指针的使用

回调指针的使用包括以下几个步骤:

3.2.1 定义函数原型

首先需要定义回调函数的函数原型,包括返回类型和参数列表。这个函数原型将作为回调函数的类型,后续需要定义回调指针来指向这个函数。

// 定义回调函数的函数原型
typedef void (*CallbackFunction)(int);

3.2.2 声明变量

使用定义的回调函数类型来声明回调指针变量。回调指针变量是一个指向回调函数的指针,可以用来存储回调函数的地址。

// 声明回调指针变量
CallbackFunction callbackPointer;

3.2.3定义

根据之前定义的函数原型,实现回调函数的具体逻辑。回调函数可以在特定事件或条件发生时被调用执行,可以在函数内部进行相应的操作。

// 回调函数
void callbackFunction(int value) {
    std::cout << "Callback Function: " << value << std::endl;
}

// 需要回调的函数
void doSomething(int value, CallbackFunction callback) {
    std::cout << "Doing something with value: " << value << std::endl;
    // 调用回调函数
    callback(value);
}

3.2.4 地址传递

在需要使用回调函数的地方,将回调函数的地址作为参数传递给其他函数。这些函数在特定的时候可以通过回调指针调用回调函数。

// 将回调函数的地址传递给其他函数
    callbackPointer = callbackFunction;

3.2.5调用

在需要触发回调函数的时候,通过回调指针调用回调函数。回调函数将执行其内部的逻辑操作,并返回结果或执行特定的任务。
 

 // 调用需要回调的函数
    doSomething(10, callbackPointer);

4.指针函数

指针函数是指返回指针的函数。与普通函数返回基本数据类型或对象不同,指针函数返回一个指针,该指针指向内存中的某个地址。

4.1指针函数的作用

指针函数的作用主要有以下几个方面:

1.返回动态分配的内存:指针函数可以用于动态分配内存,并返回指向该内存的指针。这样可以在函数外部使用这些动态分配的内存,并在适当的时候释放。

2.返回局部变量的地址:指针函数可以返回局部变量的地址。虽然局部变量的作用域只限于函数内部,但通过返回指针,可以在函数外部访问并修改局部变量的值。

3.返回数组、链表等数据结构:指针函数可以返回数组、链表等数据结构的指针,这样可以在函数外部通过指针访问和操作这些数据结构。

4.函数指针的使用:指针函数可以返回函数指针,即返回一个指向函数的指针。这样可以在函数外部调用不同的函数,实现程序的动态性。

4.2指针函数的操作

指针函数是一种返回指针的函数。它可以用来返回动态分配的内存、对象的指针或者函数指针。

下面是一些关于指针函数的常见操作:

4.2.1 声明

int* myFunction();  // 返回int类型指针的指针函数

上述代码声明了一个返回int类型指针的指针函数myFunction。

4.2.2 定义

int* myFunction() {
   int* ptr = new int(10);
   return ptr;
}


上述代码定义了一个指针函数myFunction,它动态分配了一个int类型的内存,并返回指向该内存的指针。

4.2.3 调用

int* result = myFunction();


上述代码调用指针函数myFunction,并将返回的指针存储在result变量中。

4.2.4返回

cout << *result << endl;  // 输出指针所指向的值
delete result;  // 释放动态分配的内存


上述代码使用指针函数返回的指针,输出指针所指向的值,并释放动态分配的内存。

4.3指针函数的练习

题目:编写一个指针函数,接受一个整数数组和数组的长度作为参数,返回一个指向数组中最大元素的指针。

步骤:
1. 声明并定义一个指针函数,函数名为`findMax()`,参数为整数数组和数组的长度。
2. 在函数内部,声明一个指针变量`max`,并将其初始化为指向数组的第一个元素。
3. 使用一个循环遍历数组的每个元素:
   - 如果当前元素大于`max`指向的值,则将`max`指向当前元素。
4. 返回指针`max`。

知识点:
- 指针函数的声明和定义
- 指针的初始化和赋值
- 指针的比较

流程图:
 

开始
|
声明并定义指针函数 findMax(arr, length)
|
声明并初始化指针变量 max = arr
|
循环遍历数组的每个元素
|
|   如果当前元素 > *max
|   |
|   将 max 指向当前元素
|
返回 max
|
结束


代码:
 

int* findMax(int* arr, int length) {
    int* max = arr;
    for (int i = 0; i < length; i++) {
        if (arr[i] > *max) {
            max = &arr[i];
        }
    }
    return max;
}

接下来,我们就可以在main函数里直接调用这个函数啦!这个练习可以帮助你熟悉指针函数的声明、定义和使用,以及指针的操作。可以通过测试不同的数组来验证函数的正确性。记得在使用完动态分配的内存后,及时释放它们,以避免内存泄漏。

总结

本篇博客到这里就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言,制作不易,如果对您有帮助,那请给PingdiGuo_guo一个免费的赞,谢谢啦!

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

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

相关文章

文件批量重命名神器:按长度与区间智能管理,让文件整理更高效!

在数字化时代&#xff0c;电脑中堆积如山的文件常常让我们头疼不已。命名不规范、杂乱无章的文件不仅占用了大量的存储空间&#xff0c;更在关键时刻让我们难以迅速找到所需内容。现在&#xff0c;有了这款文件批量改名神器&#xff0c;一切烦恼将烟消云散&#xff01; 首先&a…

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水&#xff0c;除却巫山不是云。不知道这句话用在这里合不合适&#xff0c;好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候&#xff0c;翻看到gitee码云上托管的项目&#xff0c;就像是自己的孩子重新又回来了一样…

观其大略之HybridCLR学习笔记

问题背景 1 现有热更方案的开发效率、性能没有到达极限&#xff0c;还有提升的空间 2 ios多平台政策导致热更新受限问题&#xff0c;ios禁止jit。根据我查找的资料&#xff0c;ios的代码段启动的时候就确定了&#xff0c;不能增加新的代码段。IOS封了内存&#xff08;或者堆&…

如何摆脱水印困扰?三款神器助您清爽无烦恼!

水印常常成为我们图片处理的一大难题&#xff0c;让我们苦恼不已。那么&#xff0c;如何能轻松摆脱这些烦人的水印呢&#xff1f;本文将向您推荐三款强大的去水印工具&#xff0c;让您清爽无烦恼&#xff0c;图片重焕光彩&#xff01; 1. 水印云 如何快速而准确地去除各类水印…

Stable Diffusion 解析:探寻 AI 绘画背后的科技神秘

AI 绘画发展史 在谈论 Stable Diffusion 之前&#xff0c;有必要先了解 AI 绘画的发展历程。 早在 2012 年&#xff0c;华人科学家吴恩达领导的团队训练出了当时世界上最大的深度学习网络。这个网络能够自主学习识别猫等物体&#xff0c;并在短短三天时间内绘制出了一张模糊但…

【RK3288 Android6, T8PRO 快捷按键 gpio 配置上拉输入】

文章目录 【RK3288 Android6&#xff0c; T8PRO 快捷按键 gpio 配置上拉输入】需求开发过程尝试找到没有用的上拉gpio尝试修改pwm1的gpio的默认上拉模式 改动 【RK3288 Android6&#xff0c; T8PRO 快捷按键 gpio 配置上拉输入】 需求 T8pro想要模仿T10 的 快捷按键&#xff…

嵌入式开发的常用软件、学习资源网站推荐

1、软件推荐 1.1、文本编辑软件 ——Notepad 1、适合编写和查看文本文件&#xff0c;也可以安装插件来查看二进制文件、对比文件 2、参考博客&#xff1a;《Notepad实用小技巧》&#xff1b; 1.2、PDF文件阅读软件——福昕PDF阅读器 福昕PDF阅读器&#xff0c;在官网就可以下载…

电商店群系统的搭建需要用到的官方接口如何申请?

电商电子商务企业往往都会需要再很多平台上面铺货&#xff0c;上传商品。 高科技的今天&#xff0c;我们已经不需要手动一个个品去上传了。那通过官方接口&#xff0c;如何实现快速铺货呢&#xff1f; 1688官方开放平台的API接口类型众多&#xff0c;并不是所有的企业都能申请…

springboot3.x集成nacos踩坑,并实现多环境配置

一、nacos安装部署 springboot3.x集成Nacos首先需要将Nacos从1.x升级到2.x&#xff0c;建议直接安装2.x版本&#xff0c;手动将1.x的配置信息迁移到2.x中&#xff0c;先并行一段时间&#xff0c;待全部迁移完成稳定运行之后再停掉1.x&#xff0c;升级和安装、操作请查看官方文…

HBuilder X删除之前登录的账号

打开目录 C:\Users\Administrator\AppData\Roaming\HBuilder X 用 HBuilder X 打开文件 prefs 将账号删除 保存文件 重启HBuilder X即可

开发手札:unity2022+vscode1.87联合开发

不得不说&#xff0c;时间的力量是很强大的&#xff0c;同时熵增理论适用于任何地方。 在现在的公司干了五年多了&#xff0c;五年前配置的内网开发机&#xff0c;i7 870016g1t hddgtx1080已经卡爆了&#xff0c;特别是硬盘掉速严重&#xff0c;开机开软件没有一两分钟都…

班主任管理班级的策略与措施

在教育的世界里&#xff0c;班主任不仅是知识的传递者&#xff0c;更是学生心灵的引路人。那么&#xff0c;如何在这个充满挑战和机遇的岗位上&#xff0c;舞动管理的翅膀&#xff0c;让班级飞得更高更远呢&#xff1f; 深入了解学生。这不仅仅是了解学生的姓名、成绩&#xff…

网络编程:TCP机械臂,UDP文件传输

1.TCP机械臂测试 程序代码&#xff1a; 1 #include<myhead.h>2 #define SER_IP "192.168.126.112" //服务器IP3 #define SER_PORT 8888 //服务器端口号4 5 #define CLI_IP "192.168.126.121" //客户端IP6 #define CLI_PORT 9999 //…

阿里云服务器2核2G性能测评99元一年和61元一年

阿里云2核2G服务器多少钱&#xff1f;99元一年&#xff0c;轻量云服务器是61元一年。2核2G服务器性能如何&#xff1f;性能很不错&#xff0c;不限制CPU性能&#xff0c;99元2核2G服务器是ECS经济型e实例&#xff0c;61元2核2G服务器是轻量应用服务器&#xff0c;都是3M公网带宽…

【智慧互联,有序充电,多场景充电】企业微电网能效及充电管理解决方案

企业需求&#xff08;目的地充电&#xff09; 站在企业的角度&#xff0c;除了要主动承担碳达峰、碳中和的社会责任&#xff0c;也需要考虑自身的经营和利润&#xff0c;需要结合企业的现状进行改造 01用能可靠、清洁 02用能安全怎么重视都不为过 03专业全面的能源管理需求…

windows无界鼠标,多机共享一套键鼠

原因 当前使用一台笔记本和一个台式机。用起来很麻烦。想要找到共享键鼠的方案。找到了无界鼠标这个软件。 安装 在两台电脑上都安装powertoy应用。 https://github.com/microsoft/PowerToys csdn下载 安装完成后找到无界鼠标打开 配置 多台电脑配置相同的key,刷新识别设…

ETAS工具链ISOLAR-AB重要概念,RTE配置,ECU抽取

RTE配置界面&#xff0c;包含ECU抽取关联 首次配置RTE&#xff0c;出现需要勾选的抽取EXTRACT 创建System System制作SWC到ECU的Mapping System制作System Data 的Mapping

简洁实用的wordpress外贸网站模板

坚果蜜饯wordpress跨境电商模板 木瓜干、菠萝干、夏威夷果、芒果干、椰片、巴旦木等wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3944 珠宝手饰wordpress外贸网站模板 金银手饰、珍珠手饰、翡翠手饰、钻石手饰、玉石珠宝手饰wordpress外贸网站模板。 https:…

word如何实现不同章节显示不同页眉

一、问题描述 写论文时遇到如下情形&#xff0c;第二章页眉跟第一章一样&#xff0c;如下图 二、解决方法 在第二章前一页空白处&#xff0c;选择依次布局→分隔符→下一页&#xff0c;如下图 双击第二章页眉&#xff0c;进入页眉编辑状态&#xff0c;点击链接到前一节按钮&a…

利用GPT开发应用001:GPT基础知识及LLM发展

文章目录 一、惊艳的GPT二、大语言模型LLMs三、自然语言处理NLP四、大语言模型LLM发展 一、惊艳的GPT 想象一下&#xff0c;您可以与计算机的交流速度与与朋友交流一样快。那会是什么样子&#xff1f;您可以创建哪些应用程序&#xff1f;这正是OpenAI正在助力构建的世界&#x…