C语言——函数指针——函数指针数组 (详解)

函数指针数组 

函数指针数组的作用

函数指针数组是一个数组,其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量,可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。

函数指针数组的使用场景有很多,以下是一些常见的应用:

  1. 回调函数:函数指针数组可以用于实现回调机制,即在某个事件发生时,根据不同的情况选择并调用相应的回调函数。
  2. 状态机:函数指针数组可以用于实现状态机,即根据当前状态选择并调用相应的处理函数。
  3. 命令分发:函数指针数组可以用于实现命令分发,即根据接收到的命令选择并调用相应的处理函数。
  4. 策略模式:函数指针数组可以用于实现策略模式,即根据不同的策略选择并调用相应的处理函数。

总之,函数指针数组提供了一种灵活的方式来选择并调用不同的函数,可以根据具体需求动态地改变函数的行为。

——————————————————————————————————————————  

函数指针数组的语法格式

函数指针数组是一个数组,其中的元素都是函数指针。函数指针是指向函数的指针变量,可以用来调用相应的函数。函数指针数组的语法格式如下:

返回值类型 (*指针数组名[数组大小])(参数列表);

其中,返回值类型是函数的返回值类型,指针数组名是函数指针数组的名称,数组大小是指针数组中元素的个数,参数列表是函数的参数类型和个数。

举个例子,

如果我们有一个函数指针数组,其中包含两个元素,个元素都指向一个无返回值、无参数的函数,可以这样声明:

void (*funcPtrArray[2])();这里,funcPtrArray是一个包含两个元素的函数指针数组,每个元素都是一个指向无返回值、无参数的函数的指针。

使用函数指针数组时,可以通过索引来访问数组中的元素,并通过函数指针调用相应的函数。

——————————————————————————————————————————  

函数指针数组语法格式的讲解

举例来说,我们可以定义一个函数指针数组,其中的元素指向不同的排序算法函数:

#include <stdio.h>// 声明排序算法函数
void bubbleSort(int arr[], int size);
void selectionSort(int arr[], int size);
void insertionSort(int arr[], int size);int main() {// 定义函数指针数组并初始化void (*sortFuncs[3])(int[], int) = {bubbleSort, selectionSort, insertionSort};//函数指针 函数指针定义三个 ,然后是(数组和,整形类型的)// 调用函数指针数组中的函数int arr[] = {5, 2, 8, 1, 9};int size = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < 3; i++) {sortFuncs[i](arr, size);//这里主要是看这一段 这个代码是我随机从网上找的,主要是让你们看看这个语法格式的使用 ,下面会进行转移表,也就是计算器的使用版本2,就是采取函数指针数组的形势进行计算的printf("排序结果:");for (int j = 0; j < size; j++) {printf("%d ", arr[j]);}printf("\n");}return 0;
}// 冒泡排序
void bubbleSort(int arr[], int size) {// 排序逻辑...
}// 选择排序
void selectionSort(int arr[], int size) {// 排序逻辑...
}// 插入排序
void insertionSort(int arr[], int size) {// 排序逻辑...
}

——————————————————————————————————————————————————————————————————————————————————————

函数指针数组的实际使用(转移表(计算器))

这里会简单提一嘴,在指针4篇章还会进行详细的解释,指针4篇章会详细解释qsort函数的使用和构建模拟

计算器的模拟版本1

运算函数 

主函数 

计算器形成

但是之前的代码是有问题的,冗余性太强

#include<stdio.h>// 函数原型声明
int add(int x, int y);
int subtract(int x, int y);
int multiply(int x, int y);
int divide(int x, int y);int main() {int input;printf("请输入运算类型(1-加法,2-减法,3-乘法,4-除法,0-退出):");scanf("%d", &input);while (input != 0) {switch (input) {case 1:printf("请输入两个加数:");int x, y;scanf("%d %d", &x, &y);printf("%d\n", add(x, y));break;case 2:printf("请输入两个减数:");scanf("%d %d", &x, &y);printf("%d\n", subtract(x, y));break;case 3:printf("请输入两个乘数:");scanf("%d %d", &x, &y);printf("%d\n", multiply(x, y));break;case 4:printf("请输入两个数,其中第二个数为除数:");scanf("%d %d", &x, &y);if (y != 0) {printf("%d\n", divide(x, y));} else {printf("除数不能为0。\n");}break;default:printf("输入错误,请输入正确的运算类型。\n");break;}printf("是否继续?(0-否,其他值-是):");scanf("%d", &input);}printf("退出计算器。\n");return 0;
}// 函数定义
int add(int x, int y) {return x + y;
}int subtract(int x, int y) {return x - y;
}int multiply(int x, int y) {return x * y;
}int divide(int x, int y) {return x / y;
}这里ai解释一下 不过多赘述 
这次计算机的目的是为了进行回调函数和函数指针数组的学习这段C语言代码实现了一个简单的计算器,能够进行加法、减法、乘法和除法运算。下面是逐行解释:
1. `#include<stdio.h>`:这行代码包含了标准输入输出头文件`stdio.h`,它是C语言中用于输入输出函数的基础头文件。
2. 函数原型声明:这些是函数原型声明,指明了将要定义的四个函数`add`、`subtract`、`multiply`和`divide`的返回类型和参数类型。
3. `int main()`:这是主函数的定义,`main`是C程序的入口点。
4. `int input;`:这行代码定义了一个整数变量`input`,用于存储用户的选择。
5. `printf("请输入运算类型(1-加法,2-减法,3-乘法,4-除法,0-退出):");`:这行代码打印出提示信息,要求用户输入运算类型。
6. `scanf("%d", &input);`:这行代码使用`scanf`函数从用户那里读取一个整数,并存储在变量`input`中。
7. `while (input != 0) {`:这是一个`while`循环,它会在用户输入0之前一直执行。
8. `switch (input)`:这是一个`switch`语句,它根据变量`input`的值来执行不同的代码块。
9. `case 1:`:这是一个`case`标签,当`input`等于1时,执行后面的代码块。
10. `printf("请输入两个加数:");`:这行代码打印出提示信息,要求用户输入两个加数。
11. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
12. `printf("%d\n", add(x, y));`:这行代码调用`add`函数,并打印出返回的结果。
13. `break;`:这个关键字用于退出`switch`语句。
14. `case 2:`:这是一个`case`标签,当`input`等于2时,执行后面的代码块。
15. `printf("请输入两个减数:");`:这行代码打印出提示信息,要求用户输入两个减数。
16. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
17. `printf("%d\n", subtract(x, y));`:这行代码调用`subtract`函数,并打印出返回的结果。
18. `break;`:这个关键字用于退出`switch`语句。
19. `case 3:`:这是一个`case`标签,当`input`等于3时,执行后面的代码块。
20. `printf("请输入两个乘数:");`:这行代码打印出提示信息,要求用户输入两个乘数。
21. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
22. `printf("%d\n", multiply(x, y));`:这行代码调用`multiply`函数,并打印出返回的结果。
23. `break;`:这个关键字用于退出`switch`语句。
24. `case 4:`:这是一个`case`标签,当`input`等于4时,执行后面的代码块。
25. `printf("请输入两个数,其中第二个数为除数:");`:这行代码打印出提示信息,要求用户输入两个数,其中第二个数为除数。
26. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
27. `if (y != 0) {`:这是一个`if`语句,它检查除数`y`是否不为0。
28. `printf("%d\n", divide(x, y));`:这行代码调用`

———————————————————————————————————————————

计算器的模拟版本2(函数指针数组的使用)(回调函数)

简化

冗余

老的代码的问题就是

冗余

写死

不能完成不同的任务

函数调用的时候只需要知道地址就可以

calc计算器

这里也称之为转移表

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x, int y)
{return x + y;
}
int subtract(int x, int y)
{return x - y;
}
int multiply(int x, int y)
{return x * y;
}
int except(int x, int y)
{return x / y;
}
void meun()
{printf("**************************\n");printf("*****    0  退出    ******\n");printf("*****    1  加法    ******\n");printf("*****    2  减法    ******\n");printf("*****    3  乘法    ******\n");printf("*****    4  除法    ******\n");printf("**************************\n");
}
void cala(int* compute(int, int))
{int x = 0; int y = 0;int pf = 0;scanf("%d %d", &x, &y);pf = compute(x, y);printf("%d ", pf);
}
int main()
{meun();int input = 0;scanf("%d", &input);	switch (input){case 0:break;case 1:cala(add);break;case 2:cala(subtract);break;case 3:cala(subtract);break;case 4:cala(except);break;default:break;}
}这里 用ai 逐行解释一下 我不过多作图解释了:
1. `#define _CRT_SECURE_NO_WARNINGS 1`:这是一个预处理器指令,用于告诉编译器忽略与安全相关的警告
2. `#include<stdio.h>`:这是一个预处理器指令,用于包含标准输入输出头文件`stdio.h`,这是C语言中用于输入输出函数的基础头文件。
3. `int add(int x, int y)`:这是一个函数定义,`add`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的和。
4. `int subtract(int x, int y)`:这是另一个函数定义,`subtract`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的差。
5. `int multiply(int x, int y)`:这是另一个函数定义,`multiply`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的积。
6. `int except(int x, int y)`:这是另一个函数定义,`except`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的商。注意,这个函数没有进行除数是否为0的检查,这在实际使用中是不安全的。
7. `void meun()`:这是一个函数定义,`meun`是一个函数名,它没有返回值。这个函数的作用是打印出菜单供用户选择运算类型。
8. `void cala(int* compute(int, int))`:这是另一个函数定义,`cala`是一个函数名,它接受一个指向函数的指针作为参数。这个函数的作用是调用用户提供的运算函数,并打印出结果。
9. `int main()`:这是主函数的定义,`main`是一个特殊的关键字,表示程序的入口点。
10. `meun();`:这行代码调用`meun`函数,打印出菜单。
11. `int input = 0;`:这行代码定义了一个整数变量`input`并初始化为0,用于存储用户的选择。
12. `scanf("%d", &input);`:这行代码使用`scanf`函数从用户那里读取一个整数,并存储在变量`input`中。
13. `switch (input)`:这是一个`switch`语句,它根据变量`input`的值来执行不同的代码块。
14. `case 0:`:这是一个`case`标签,当`input`等于0时,执行后面的代码块。
15. `break;`:这个关键字用于退出`switch`语句。
16. `case 1:`:这是一个`case`标签,当`input`等于1时,执行后面的代码块。
17. `cala(add);`:这行代码调用`cala`函数,并传递`add`函数的地址作为参数。
18. `break;`:这个关键字用于退出`switch`语句。
19. `case 2:`:这是一个`case`标签,当`input`等于2时,执行后面的代码块。
20. `cala(subtract);`:这行代码调用`cala`函数,并传递`subtract`函数的地址作为参数。
21. `break;`:这个关键字用于退出`switch`语句。
22. `case 3:`:这是一个`case`标签,当`input`等于3时,执行后面的代码块。
23. `cala(subtract);`:这行代码调用`cala`函数,并传递`subtract`函数的地址作为参数。这里似乎是一个错误,因为`subtract`函数并不适合乘法操作。
24. `break;`:这个关键字用于退出`switch`语句。
25. `case 4:`:这是一个`case`标签,当`input`等于4时,执行后面的代码块。
26. `cala(except);`:这行代码调用`cala`函数,并传递`except`函数的地址作为参数。
27. `break;`:

—————————————————————————————————————————— 

版本3(函数指针数组的使用)

计算机代码的简化

创建函数指针的数组

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x, int y)
{return x + y;
}
int subtract(int x, int y)
{return x - y;
}
int multiply(int x, int y)
{return x * y;
}
int except(int x, int y)
{return x / y;
}
void meun()
{printf("**************************\n");printf("*****    0  退出    ******\n");printf("*****    1  加法    ******\n");printf("*****    2  减法    ******\n");printf("*****    3  乘法    ******\n");printf("*****    4  除法    ******\n");printf("**************************\n");
}
int main()
{int (*compute[5])(int, int) = { 0, add,subtract,multiply,except };int input = 0; do{meun();printf("请选择:\n");scanf("%d", &input);printf("请输入:");if (input>=1&& input<=4){int x = 0; int y = 0; int zd = 0;scanf("%d %d", &x, &y);zd = (*compute[input])(x, y);printf("%d\n", zd);}else if (input == 0){printf("退出程序。");break;}else {printf("输入错误。");}} while (input);
}这里 用ai 逐行解释一下 我不过多作图解释了:
这段代码是C语言编写的一个简单计算器程序,下面是逐行解释:
1. `#define _CRT_SECURE_NO_WARNINGS 1`:这是一个预处理器指令,用于告诉编译器忽略与安全相关的警告,特别是在使用像`fgets`、`fopen`等函数时。这行代码应该只包含一次,重复定义可能会导致编译错误。
2. `#include<stdio.h>`:这是一个预处理器指令,用于包含标准输入输出头文件`stdio.h`,这是C语言中用于输入输出函数的基础头文件。
3. `int add(int x, int y)`:这是一个函数定义,`add`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的和。
4. `int subtract(int x, int y)`:这是另一个函数定义,`subtract`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的差。
5. `int multiply(int x, int y)`:这是另一个函数定义,`multiply`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的积。
6. `int except(int x, int y)`:这是另一个函数定义,`except`是一个函数名,它接受两个整数参数`x`和`y`,并返回它们的商。注意,这个函数没有进行除数是否为0的检查,这在实际使用中是不安全的。
7. `void meun()`:这是一个函数定义,`meun`是一个函数名,它没有返回值。这个函数的作用是打印出菜单供用户选择运算类型。
8. `int main()`:这是主函数的定义,`main`是一个特殊的关键字,表示程序的入口点。
9. `int (*compute[5])(int, int) = { 0, add,subtract,multiply,except }`:这行代码定义了一个函数指针数组`compute`,长度为5。每个元素指向一个算术运算函数。数组的第一个元素被初始化为`0`,这通常用于指针数组的终止标志。
10. `int input = 0;`:这行代码定义了一个整数变量`input`并初始化为0,用于存储用户的选择。
11. `do`:这是一个循环开始关键字,表示开始一个`do-while`循环。
12. `meun();`:这行代码调用`meun`函数,打印出菜单。
13. `printf("请选择:\n");`:这行代码打印出提示信息“请选择:”。
14. `scanf("%d", &input);`:这行代码使用`scanf`函数从用户那里读取一个整数,并存储在变量`input`中。
15. `printf("请输入:");`:这行代码打印出提示信息“请输入:”。
16. `if (input>=1&& input<=4)`:这是一个条件判断,检查用户输入是否在1到4之间,包括1和4。
17. `{ int x = 0; int y = 0; int zd = 0;`:这个大括号开始了一个代码块,用于执行当用户输入在1到4之间时的操作。
18. `scanf("%d %d", &x, &y);`:这行代码使用`scanf`函数从用户那里读取两个整数,并存储在变量`x`和`y`中。
19. `zd = (*compute[input])(x, y);`:这行代码调用相应的运算函数,并将结果存储在变量`zd`中。
20. `printf("%d\n", zd);`:这行代码打印出计算结果。
21. `}`:这个大括号结束了上面的代码块。
22. `else if (input == 0)`:这是另一个条件判断,检查用户输入是否为0。
23. `{ printf("退出程序。");`:这个代码块用于执行当用户输入为0时的操作,打印出提示信息。
24. `break;`:这个关键字用于退出循环。
25. `}`:这个大括号结束了上面的条件判断。
26. `else`:这是另一个条件判断,用于处理用户输入不在1到4之间

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

计算器代码总结 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//菜单
void meun()
{printf("**************************\n");printf("*****    0  退出    ******\n");printf("*****    1  加法    ******\n");printf("*****    2  减法    ******\n");printf("*****    3  乘法    ******\n");printf("*****    4  除法    ******\n");printf("**************************\n");
}
// 函数定义
int add(int x, int y) 
{return x + y;
}int sub(int x, int y) 
{return x - y;
}int mul(int x, int y) 
{return x * y;
}int dive(int x, int y) 
{return x / y;
}//函数指针数组的使用
void Function_pointers()
{int(*compute[5])(int, int) = { 0,add,sub,mul,dive };int input = 0; int x = 0; int y = 0;do{if (input > 0 && input <= 4){meun();printf("请输入>\n");scanf("%d", &input);printf("请输入计算数值>\n");scanf("%d %d", &x, &y);int outcome = (*compute[input])(x, y);printf("结果是:%d\n", outcome);}else if (input == 0){printf("退出");break;}else{printf("输入错误。");}} while (input);
}//回调函数的使用(依旧是指针函数数组)
void invoke(int*ps(int, int))
{int x = 0; int y = 0;printf("请输入计算数值>\n");scanf("%d %d", &x, &y);int outcome = (*ps)(x, y);printf("结果是:%d\n", outcome);}
void Callback()
{int input = 0;do{meun();printf("请输入>\n");scanf("%d", &input);switch (input){case 0:break;case 1:invoke(add);break;case 2:invoke(sub);break;case 3:invoke(mul);break;case 4:invoke(dive);break;default:printf("输入错误。");break;}} while (input);
}
//正常计算函数
void count()
{int input = 0;do{int x = 0; int y = 0;meun();printf("请输入>\n");scanf("%d", &input);int outcomt = 0;switch (input){case 0:printf("退出");break;case 1:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = add(x, y);printf("结果是:%d\n", outcomt);break;case 2:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = sub(x, y);printf("结果是:%d\n", outcomt);break;case 3:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = mul(x, y);printf("结果是:%d\n", outcomt);break;case 4:printf("请输入计算数值>\n");scanf("%d %d", &x, &y);outcomt = dive(x, y);printf("结果是:%d\n", outcomt);break;default:printf("输入错误。");break;}} while (input);
}//主函数
int main()
{//printf("函数指针数组的使用>\n");//Function_pointers();//printf("回调函数的使用>\n");//Callback();printf("正常函数的使用>\n");count();
}

 

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

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

相关文章

微服务day06-Docker

Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 1.什么是Docker? 大型项目组件很多&#xff0c;运行环境复杂&#xff0c;部署时会遇到各种…

Beans模块之工厂模块BeanFactory

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Linux 之九:CentOS 上 Tomcat 安装、SpringBoot 项目打包和部署

安装 Tomcat 下载 a. 方式一&#xff1a;可以在windows 真机上下载后&#xff0c;再上传到服务器 b. 方式二&#xff1a;可以在服务器端使用 wget 下载命令来下载 登录官网https://tomcat.apache.org/download-90.cgi&#xff0c;选择 linux 版本 右键&#xff0c;获取下载链接…

服务器-->网站制作-->接口开发,一篇文章一条龙服务(2)

作者&#xff1a;q: 1416279170v: lyj_txd前述&#xff1a;本人非专业&#xff0c;兴趣爱好自学自研&#xff0c;很多没有说清楚的地方见谅&#xff0c;欢迎一起讨论的小伙伴~ 上期回顾&#xff0c;了解 服务器&#xff0c;网站制作&#xff0c;接口开发之见的关系&#xff0c…

vue中实现3d词云效果(已封装组件)

<!--* Description: 词云组件 页面* Date: 2024/3/10 23:39 --> <template><div:style"{display: flex,justifyContent: center,border: 1px solid red,}"><svg:width"width":height"height"mousemove"listener($even…

【HarmonyOS】ArkUI - 自定义卡片样式

ArkUI - 自定义卡片样式 HarmonyOS API 9 没有提供原生的卡片样式&#xff0c;我定义了一个卡片样式&#xff0c;可以方便大家在日常开发中使用。 效果图&#xff1a; 卡片样式代码如下&#xff1a; Styles function card() {.width(95%).padding(20).backgroundColor(Col…

C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码

1 割线法 割线法用于求方程 f(x) 0 的根。它是从根的两个不同估计 x1 和 x2 开始的。这是一个迭代过程&#xff0c;包括对根的线性插值。如果两个中间值之间的差值小于收敛因子&#xff0c;则迭代停止。 亦称弦截法&#xff0c;又称线性插值法.一种迭代法.指用割线近似曲线求…

ubuntu20.04环境搭建:etcd+patroni+pgbouncer+haproxy+keepalived的postgresql集群方案

搭建基于etcdpatronipgbouncerhaproxykeepalived的postgresql集群方案 宿主机操作系统:ubuntu20.04 使用kvm搭建虚拟环境(如没有安装kvm&#xff0c;请先自行安装kvm) 1、安装kvm服务 ①、查看虚拟支持 如果CPU 支持硬件虚拟化则输出结果大于0&#xff0c;安装kvm-ok命令检…

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

鸿蒙报错:Hhvigor Update the SDKs by going to Tools > SDK Manager....

鸿蒙报错&#xff1a;Hhvigor Update the SDKs by going to Tools > SDK Manager… 打开setting里面的sdk&#xff0c;将API9工程下的全部勾上&#xff0c;应用下载 刚打开 js 和 Native 是没勾上的

智慧城市与智慧乡村:共创城乡一体化新局面

一、引言 随着科技的不断进步和城乡发展的日益融合&#xff0c;智慧城市与智慧乡村的建设已成为推动城乡一体化发展的新引擎。智慧城市利用物联网、大数据、云计算等先进技术&#xff0c;实现城市治理、公共服务、产业发展等领域的智能化&#xff1b;而智慧乡村则借助现代科技…

每日五道java面试题之springMVC篇(二)

目录&#xff1a; 第一题. 请描述Spring MVC的工作流程&#xff1f;描述一下 DispatcherServlet 的工作流程&#xff1f;第二题. MVC是什么&#xff1f;MVC设计模式的好处有哪些?第三题. 注解原理是什么?第四题. Spring MVC常用的注解有哪些&#xff1f;第五题. SpingMvc中的…

C++ 中的头文件和源文件

#include<>一般用于包含系统头文件&#xff0c;诸如stdlib.h、stdio.h、iostream等&#xff1b; 类库目录下查找失败&#xff0c;编译器会终止查找&#xff0c;直接报错&#xff1a;No such file or directory. #include""一般用于包含自定义头文件&#xff…

【JAVA】CSS3:3D、过渡、动画、布局、伸缩盒

1 3D变换 1.1 3D空间与景深 /* 开启3D空间,父元素必须开启 */transform-style: preserve-3d;/* 设置景深&#xff08;你与z0平面的距离 */perspective:50px; 1.2 透视点位置 透视点位置&#xff1a;观察者位置 /* 100px越大&#xff0c;越感觉自己边向右走并看&#xff0c;…

stega1

题目链接&#xff1a;ctf.show 下载附件打开是一张jpg照片 无密码型jphs隐写得到flag flag{3c87fb959e5910b40a04e0491bf230fb}

微信小程序开发系列(二十五)·wxml语法·条件渲染wx:if, wx:elif, wx:else 属性组以及hidden 属性的使用

目录 1. 使用 wx:if、wx:elif、wx:else 属性组 2. 使用 hidden 属性 条件渲染主要用来控制页面结构的展示和隐藏,在微信小程序中实现条件渲染有两种方式: 1. 使用 wx:if, wx:elif, wx:else 属性组 2. 使用 hidden 属性 wx:if 和 hidden 二者的区别&#xff1a; 1. wx…

操作系统笔记(进程)

注&#xff1a; 下面图片资源来源于 王道计算机考研 操作系统 1.进程概念 进程&#xff08;process&#xff09;&#xff1a;是动态的&#xff0c;是程序的一次执行过程&#xff08;同一程序多次执行&#xff0c;会产生多个进程&#xff09;程序&#xff1a;是静态的&…

基于电鳗觅食优化算法(Electric eel foraging optimization,EEFO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

指针【理论知识速成】(5)

一.回调函数&#xff1a; 1.什么事回调函数&#xff1a;通过函数指针调用函数 2.应用例子&#xff1a; https://blog.csdn.net/hot_water_oh/article/details/136572650?spm1001.2014.3001.5501 &#xff08;此链接为提到转义表所在博客的链接&#xff09; 依然以转义表为例…

drone ci 是什么

Drone CI是一个开源的持续集成和持续部署&#xff08;CI/CD&#xff09;系统&#xff0c;它使用Docker容器技术自动化软件的构建、测试和部署过程。Drone的设计哲学是简单和易用&#xff0c;通过使用Docker容器&#xff0c;它可以很容易地创建隔离的环境来运行测试和部署任务&a…