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

C 语 言 --- 指 针 3

C 语 言 --- 指 针 3

  • 函 数 指 针
  • 函 数 指 针 数 组
  • 代 码 解 释
  • 回 调 函 数 - - - qsort
    • 模 拟 实 现 qsort 函 数
  • 总结

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言
💡个 人 主 页:@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏:C 启新程
✨代 码 趣 语:好 的 代 码 会 促 生 好 的 代 码,糟 糕 的 代 码 也 会 促 生 糟 糕 的 代 码。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee

在这里插入图片描述

         在 编 程 的 世 界 里,每 一 行 代 码 都 可 能 隐 藏 着 无 限 的 可 能 性 。你 是 否 想 过,一 个 小 小 的 程 序 究 竟 能 改 变 什 么?它 可 以 是 解 决 复 杂 问 题 的 工 具 ,也 可 以 是 实 现 梦 想 的 桥 梁。今 天,就 让 我 们 一 起 走 进 C 语 言 指 针 的 世 界,探 索 它 的 无 限 潜 力。

函 数 指 针

定 义

         函 数 指 针 是 指 向 函 数 的 指 针 变 量。它 跟 普 通 指 针 有 所 不 同,普 通 指 针 指 向 的 是 数 据,而 函 数 指 针 指 向 的 是 函 数 的 代 码,函 数 指 针 存 储 的 是 函 数 的 地 址。

格 式

return_type (*pointer_name)(parameter_list);

return_type - - - 函 数 的 返 回 类 型

pointer_name - - - 函 数 指 针 的 名 称

parameter_list - - - 函 数 的 参 数 列 表

&函 数 名 和 函 数 名 的 地 址

下 面 展 示代 码 示 例

#include<stdio.h>
int Add(int x, int y)
{return x + y;
}
int main()
{printf("%p\n", &Add);printf("%p\n", Add);return 0;
}

在这里插入图片描述

总 结

         函 数 名 和 & 函 数 名 可 以 互 换,它 们 的 地 址 是 相 同 的。 但 是 &Add 能 更 清 晰 地 表 明 是 在 获 取 函 数 地 址。

使 用 函 数 指 针 来 输 出 两 数 之 和

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 解 释 会 有 新 收 获。

下 面 展 示代 码 示 例

#include<stdio.h>
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf)(int, int) = &Add;//pf存放函数地址的指针变量//&函数名和函数名都是函数的地址int ret = (*pf)(2, 3);printf("%d\n", ret);return 0;
}

在这里插入图片描述

补 充

         int (*pf)(int, int) = &Add;这 句 代 码 中 pf 是 存 放 函 数 地 址 的 指 针 变 量,也 是 函 数 指 针 的 变 量 名。因 为 函 数 名 和 & 函 数 名 的 地 址 是 相 同 的,所 以 这 句 代 码 也 可 以 写 成 int (*pf)(int, int) = Add;

函 数 指 针 数 组

定 义

         在 C 语 言 里,函 数 指 针 数 组 是 一 种 特 殊 的 数 组,其 每 个 元 素 均 为 函 数 指 针。借 助 函 数 指 针 数 组,能 够 依 据 不 同 的 条 件 或 者 索 引,便 捷 地 调 用 不 同 的 函 数。

格 式

return_type (*array_name[size])(parameter_list);

return_type - - - 函 数 的 返 回 类 型

array_name - - - 数 组 的 名 称

size - - - 数 组 的 大 小

parameter_list - - - 函 数 的 参 数 列 表

使 用 函 数 指 针 数 组 来 输 出 两 数 的 加 减 乘 除

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 解 释 会 有 新 收 获。

下 面 展 示代 码 示 例

#include <stdio.h>
int add(int a, int b) 
{return a + b;
}
int sub(int a, int b) 
{return a - b;
}
int mul(int a, int b) 
{return a * b;
}
int Div(int x, int y)
{return x / y;
}
int main() 
{//声明一个函数指针数组int (*arr[4])(int, int) = { add, sub, mul, Div };//通过函数指针数组调用函数int result1 = arr[0](3, 4);int result2 = arr[1](3, 4);int result3 = arr[2](3, 4);int result4 = arr[3](3, 4);printf("3 + 4 = %d\n", result1);printf("3 - 4 = %d\n", result2);printf("3 * 4 = %d\n", result3);printf("3 / 4 = %d\n", result4);return 0;
}

在这里插入图片描述

代 码 解 释

下 面 两 段 代 码 来 自《 C 陷 阱 和 缺 陷 》这 本 书 中 的 第 15 页 和 第 19 页。

下 面 展 示第 一 段 代 码

(*(void (*)())0)();

温 馨 提 示:读 者 们 ,先 自 己 分 析 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 解 释 会 有 新 收 获。

代 码 解 析

(void (*)())

         这 是 一 个 强 制 类 型 转 换 操 作 符。void ( * )( ) 定 义 了 一 个 函 数 指 针 类 型,该 类 型 的 函 数 指 针 指 向 的 函 数 没 有 返 回 值(void),并 且 没 有 参 数( 空 括 号 表 示 无 参 数)。所 以 (void (*)()) 表 示 把 一 个 值 强 制 转 换 为 这 种 函 数 指 针 类 型。

(void (*)())0

         这 里 将 整 数 0 强 制 转 换 为 void ( * )( ) 类 型 的 函 数 指 针。因 为 函 数 指 针 存 储 一 个 函 数 的 地 址,把 内 存 地 址 0 当 作 一 个 函 数 的 起 始 地 址,认 为 在 这 个 地 址 处 存 放 着 一 个 没 有 返 回 值 且 无 参 数 的 函 数。

*( void ( * )( ) )0

         对 前 面 得 到 的 函 数 指 针 进 行 解 引 用 操 作。解 引 用 操 作 会 获 取 该 指 针 所 指 向 的 函 数。

( * ( void ( * )( ) ) 0 ) ( )

         最 后 加 上 括 号 ( ),表 示 调 用 这 个 解 引 用 得 到 的 函 数。也 就 是 尝 试 调 用 位 于 内 存 地 址 0 处 的 函 数。

代 码 整 体 含 义

         ( * ( void ( * )( ) ) 0 )( ); 这 段 代 码 的 作 用 是 尝 试 调 用 内 存 地 址 为 0 处 的 函 数。不 过,在 大 多 数 操 作 系 统 里,内 存 地 址 0 是 受 保 护 的 区 域,程 序 一 般 没 有 权 限 访 问 这 个 区 域。所 以 执 行 这 段 代 码 通 常 会 引 发 段 错 误。

下 面 展 示第 二 段 代 码

void (*signal ( int, void(*)(int) ) )(int);

温 馨 提 示:读 者 们 ,先 自 己 分 析 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 解 释 会 有 新 收 获。

代 码 解 析

void( * )( int )

         这 是 一 个 函 数 指 针 类 型。该 函 数 指 针 指 向 的 函 数 接 受 一 个 int 类型 的 参 数,并 且 没 有 返 回 值(void)。

( * signal ( int, void( * )(int) ) )

         signal 是 函 数 名。signal 函 数 有 两 个 参 数,第 一 个 参 数 是 int 类型,第二 个 参 数 是 void( * )( int )。表 示 signal 函 数 接 收 一 个 整 数 和 一 个 函 数 指 针 作 为 参 数。

void ( * signal ( int, void( * )(int) ) )(int);

         signal 函 数 的 返 回 类 型 是 一 个 函 数 指 针,该 函 数 指 针 能 够 指 向 的 那 个 函 数 的 参 数 是 int,返 回 类 型 是 void。

代 码 缩 写

下 面 展 示代 码 缩 写

typedef void(*pf_t)(int);
pf_t signal(int, pf_t);

回 调 函 数 - - - qsort

在这里插入图片描述

定 义

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

qsort 的 函 数 原 型

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));

qsort 函 数 包 含 在 stdlib.h 头 文 件 中。

base - - - 指 向 待 排 序 数 组 起 始 位 置 的 指 针,由 于 使 用 void * 类 型,所 以 它 能 处 理 任 意 类 型 的 数 据

num - - - 数 组 里 元 素 的 数 量

size - - - 每 个 元 素 的 大 小( 以 字 节 为 单 位 )。

compar - - - 回 调 函 数,用 于 比 较 两 个 元 素 的 大 小。该 函 数 接 收 两 个 const void * 类 型 的 指 针,分 别 指 向 要 比 较 的 两 个 元 素,返 回 一 个 整 数 值 来 表 示 它 们 的 大 小 关 系。

size_t

         size_t 是 一 种 无 符 号 整 数 类 型,这 意 味 着 它 只 能 表 示 非 负 整 数。因 为 数 组 元 素 的 数 量 和 元 素 的 大 小 不 可 能 是 负 数,所 以 使 用 无 符 号 类 型 是 合 理 的。

回 忆 冒 泡 函 数

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 解 释 会 有 新 收 获。

下 面 展 示代码示例

#include<stdio.h>
void sort(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] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
int main()
{int arr[] = { 4,3,2,7,5,8,6,1,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);sort(arr, sz);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

使 用 qsort 函 数 升 序

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 解 释 会 有 新 收 获。

下 面 展 示代 码 示 例

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;//升序
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

代 码 解 析

qsort(arr, sz, sizeof(arr[0]), cmp_int);

参 数 意 义

arr - - - 指 向 待 排 序 数 组 起 始 位 置 的 指 针

sz - - - 数 组 中 元 素 的 数 量

sizeof(arr[0]) - - - 每 个 元 素 的 大 小(以 字 节 为 单 位)。

cmp_int - - - 比 较 函 数 的 指 针,用 于 定 义 元 素 之 间 的 比 较 规 则

qsort 函 数 内 部 执 行 流 程

选 择 基 准 元 素

         qsort 函 数 采 用 快 速 排 序 算 法,快 速 排 序 的 第 一 步 是 选 择 一 个 基 准 元 素 。这 个 基 准 元 素 可 以 是 数 组 中 的 任 意 一 个 元 素,常 见 的 选 择 方 式 有 选 择 第 一 个 元 素、最 后 一 个 元 素 或 者 中 间 元 素 等。

分 区 操 作

         以 选 择 的 基 准 元 素 为 标 准,将 数 组 分 为 两 部 分:一 部 分 是 小 于 等 于 基 准 元 素 的 元 素,另 一 部 分 是 大 于 基 准 元 素 的 元 素。这 个 过 程 称 为 分 区 操 作。具 体 步 骤 如 下:

1、设 定 两 个 指 针,一 个 从 数 组 的 起 始 位 置 开 始(记 为 left),另 一 个 从 数 组 的 末 尾 位 置 开 始(记 为 right)。

2、从 left 指 针 开 始,向 右 移 动,直 到 找 到 一 个 大 于 基 准 元 素 的 元 素;从 right 指 针 开 始,向 左 移 动,直 到 找 到 一 个 小 于 等 于 基 准 元 素 的 元 素。

3、交 换 这 两 个 元 素 的 位 置。

4、重 复 上 述 步 骤,直 到 left 指 针 和 right 指 针 相 遇

5、最 后 将 基 准 元 素 与 left 指 针( 或 right 指 针)所 指 向 的 元 素 交 换 位 置,此 时 基 准 元 素 就 处 于 其 最 终 的 排 序 位 置。

递 归 排 序

         分 区 操 作 完 成 后,数 组 被 分 成 了 两 部 分,分 别 对 这 两 部 分 递 归 地 调 用 qsort 函 数 进 行 排 序,直 到 每 个 子 数 组 的 长 度 为 1 或 0,此 时 排 序 完 成。

比 较 函 数 cmp_int 的 作 用

         在 分 区 操 作 和 递 归 排 序 过 程 中,qsort 函 数 会 多 次 调 用 比 较 函 数 cmp_int 来 确 定 元 素 之 间 的 大 小 关 系。

cmp_int 函 数 的 代 码 如 下:

int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2; // 升序
}

const void * e1 和 const void * e2

         这 两 个 参 数 是 指 向 要 比 较 的 两 个 元 素 的 指 针,由 于 qsort 是 一 个 通 用 的 排 序 函 数,所 以 使 用 void* 类 型 的 指 针 来 表 示 任 意 类 型 的 元 素。

*(int * ) e1 - *( int * ) e2

         因 为 参 数 为 const void * ,所 以 要 将 e1 和 e2 指 针 转 换 为 int* 类 型 的 指 针,然 后 解 引 用 得 到 它 们 所 指 向 的 整 数 值,最 后 返 回 它 们 的 差 值。如 果 差 值 小 于 0,则 表 示 e1 指 向 的 元 素 小 于 e2 指 向 的 元 素;如 果 差 值 等 于 0,则 表 示 两 个 元 素 相 等;如 果 差 值 大 于 0,则 表 示 e1 指 向 的 元 素 大 于 e2 指 向 的 元 素。

使 用 qsort 函 数 降 序

下 面 展 示代 码 示 例

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{return *(int*)e2 - *(int*)e1;//升序
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

模 拟 实 现 qsort 函 数

下 面 展 示代 码 示 例

#include<stdio.h>
#include<string.h>
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;//升序
}
void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0;i < width;i++){char temp = *buf1;*buf1 = *buf2;*buf2 = temp;buf1++;buf2++;}
}
void bubble_sort(void* base, size_t sz,size_t width,int (*cmp)(const void* e1,const void* e2))
{size_t i = 0;for (i = 0;i < sz - 1;i++){size_t j = 0;for (j = 0;j < sz - 1 - i;j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

通 用 冒 泡 排 序 函 数 bubble_sort

void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{size_t i = 0;for (i = 0; i < sz - 1; i++){size_t j = 0;for (j = 0; j < sz - 1 - i; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}
}

         bubble_sort 是 一 个 通 用 的 冒 泡 排 序 函 数,可 以 对 任 意 类 型 的 数 组 进 行 排 序。

         void * base 指 向 待 排 序 数 组 起 始 位 置 的 指 针,使 用 void* 类 型 是 为 了 让 该 函 数 可 以 处 理 任 意 类 型 的 数 据。

size_t sz 表 示 数 组 中 元 素 的 数 量。

size_t width 表 示 每 个 元 素 的 大 小(以 字 节 为 单 位)。

         int( * cmp)(const void * e1, const void * e2) 这 是 一 个 函 数 指 针,指 向 一 个 比 较 函 数,用 于 定 义 元 素 之 间 的 比 较 规 则。

外 层 for 循 环 控 制 排 序 的 轮 数,总 共 需 要 进 行 sz - 1 轮。

         内 层 for 循 环 用 于 比 较 相 邻 的 元 素,如 果 前 一 个 元 素 大 于 后 一 个 元 素,则 调 用 Swap 函 数 交 换 它 们 的 位 置。

交 换 函 数 Swap

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

Swap 函 数 用 于 交 换 两 个 元 素 的 内 容。

         char * buf1 和 char * buf2 这 两 个 参 数 是 指 向 要 交 换 的 两 个 元 素 的 指 针,使 用 char* 类 型 是 为 了 按 字 节 进 行 交 换,从 而 可 以 处 理 任 意 类 型 的 数 据。

int width 表 示 每 个 元 素 的 大 小( 以 字 节 为 单 位 )。

通 过 一 个 for 循 环,逐 字 节 交 换 buf1 和 buf2 所 指 向 的 元 素 的 内 容。

在这里插入图片描述

总结

         至 此,关 于 C 语 言 指 针 的 探 索 暂 告 一 段 落,但 你 的 编 程 征 程 才 刚 刚 启 航。写 代 码 是 与 机 器 深 度 对 话,过 程 中 虽 会 在 语 法、算 法 困 境 里 挣 扎,但 这 些 磨 砺 加 深 了 对 代 码 的 理 解。愿 你 合 上 电 脑 后,灵 感 不 断,在 C 语 言 的 世 界 里 持 续 深 耕,书 写 属 于 自 己 的 编 程 传 奇,下 一 次 开 启 ,定 有 全 新 的 精 彩 等 待。小 编 期 待 重 逢,盼 下 次 阅 读 见 你 们 更 大 进 步,共 赴 代 码 之 约!

相关文章:

C 语 言 --- 指 针 3

C 语 言 --- 指 针 3 函 数 指 针函 数 指 针 数 组代 码 解 释回 调 函 数 - - - qsort模 拟 实 现 qsort 函 数 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1f4a1;个 人 主 页&#xff1a;笑口常开x…...

蓝桥杯之递归

1.数字三角形 题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和&#xff08;路径上的每一步只可沿左斜线向下或右斜线向下走&#xff09;。 输…...

学习笔记十八——Rust 封装

&#x1f9f1; Rust 封装终极指南&#xff1a;结构体、模块、Trait、目录结构与模块引用 &#x1f9ed; 目录导航 什么是封装&#xff1f;Rust 的封装理念Rust 的封装工具总览模块&#xff08;mod&#xff09;和访问控制&#xff08;pub&#xff09;详解结构体和枚举&#xff…...

【面试向】点积与注意力机制,逐步编码理解自注意力机制

点积&#xff08;dot product&#xff09;两个向量点积的数学公式点积&#xff08;dot product&#xff09;与 Attention 注意力机制&#xff08;Attention&#xff09;注意力机制的核心思想注意力机制中的缩放点积自注意力机制中&#xff0c;谁注意谁&#xff1f; 逐步编码理解…...

基础数学知识-线性代数

1. 矩阵相乘 c i j = a i k ∗ b k j c_{ij} = a_{ik} * b_{kj} cij​=aik​∗bkj​ 1. 范数 1. 向量的范数 任意一组向量设为 x ⃗ = ( x 1 , x 2 , . . . , x N ) \vec{x}=(x_1,x_2,...,x_N) x =(x1​,x2​,...,xN​) 如下: 向量的1范数: 向量的各个元素的绝对值之和∥ …...

【KWDB 创作者计划】_上位机知识篇---Docker容器

文章目录 前言1. Docker 容器是什么&#xff1f;隔离性轻量级可移植性可复用性 2. Docker 核心概念镜像容器仓库Dockerfile 3. Docker 基本使用(1) 安装 Docker(2) 容器生命周期管理(3) 镜像管理(4) 进入容器内部(5) 数据持久化&#xff08;挂载卷&#xff09;(6) 网络管理 4. …...

指针函数和函数指针

指针函数本质是一个函数&#xff0c;只是函数的返回值是指针类型 函数指针本质是一个指针&#xff0c;只是这个指针指向的是一个函数 指针函数 函数有很多类型的返回值&#xff0c;例如 short funcA(参数列表) // 表示该函数返回值是一个short类型 void funcA(参数列表) // 表…...

案例驱动的 IT 团队管理:创新与突破之路:第六章 组织进化:从案例沉淀到管理体系-6.1 案例库建设方法论-6.1.2案例分级与标签体系

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 案例分级与标签体系构建方法论&#xff1a;IT团队知识管理的结构化实践1. 案例库建设的战略价值与核心挑战1.1 案例管理的战略定位1.2 分级标签体系的核心价值 2. 案例分级体…...

sqlilabs-Less之HTTP头部参数的注入——基础篇

Less-18 user-agent报错注入 这一关的代码漏洞点出现在了insert语句&#xff0c;因为这里没有对user-agent和ip_address进行过滤&#xff0c;&#xff0c;并且输出了mysql的错误信息 补充知识点 PHP里用来获取客户端IP的变量 $_SERVER[HTTP_CLIENT_IP] #这个很少使用&#xf…...

java多线程相关内容

java线程创建的方式 一共有四种方式 继承 Thread 类&#xff1a;本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例 启动线程的唯一方 法就是通过 **Thread 类的 start()**实例方法。start()方法是一个 native 方法&#xff0c;它将启动一个新线 程&…...

Windows Server .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题

第一篇&#xff1a; Windows .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题 第二篇&#xff1a;Windows Server .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题 第三篇&#xff1a;Windows .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题 设置…...

ubuntu24.04上使用qemu+buildroot+uboot+linux+tftp+nfs模拟搭建vexpress-ca9嵌入式linux开发环境

1 准备工作 1.1 安装依赖工具 sudo apt-get update && sudo apt-get install build-essential git bc flex libncurses5-dev libssl-dev device-tree-compiler1.2 安装arm交叉编译工具链 sudo apt install gcc-arm-linux-gnueabihf安装之后&#xff0c;在终端输入ar…...

Cocos Creater打包安卓App添加隐私弹窗详细步骤+常见问题处理

最终演示效果,包含所有代码内容 + 常见错误问题处理 点击服务协议、隐私政策,跳转到相关网页, 点击同意进入游戏,不同意关闭应用 一,添加Activity,命名为MyLaunchActivity 二,编写MyLaunchActivity.java的内容 package com.cocos.game.launch;import android.os.Bund…...

UI文件上传

1、文件上传&#xff1a;文件上传是自动化中比较麻烦棘手的部分。 有些场景我们需要上传本地文件到项目里。这种比较麻烦&#xff0c;因为需要点开文件上传的窗口后&#xff0c;打开的是windows的文件选择窗口&#xff0c; 而selenium是无法操作这个窗口的。 selenium只能操作…...

2.凸包优化求解

1.减而治之(Decrease and Conquer) 插入排序 典型的减而治之算法就是插入排序方法 插入排序法: 在未排序中选择一个元素&#xff0c;插入到已经排序号的序列中 将凸包也采用减而治之的方法 2.In-Convex-Polygon Test 怎么判断引入的极点存在于多边形里面还是外面&#xff1…...

从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题

开头运行可看官网 链接: unibest官网 一&#xff1a;vscode中vue3代码显示报错标红波浪线 去查看扩展商店发现一些插件都弃用了&#xff0c;例如h5的插件以及vue老插件 解决办法&#xff1a;下载Vue - Official插件&#xff08;注意&#xff1a;横杠两边是要加空格的&#xff…...

jmeter中文乱码问题解决

修改jmeter.properties配置文件‌ 进入JMeter安装目录的bin文件夹&#xff0c;找到jmeter.properties文件。搜索参数sampleresult.default.encodingUTF-8&#xff0c;取消注释&#xff08;删除行首的#&#xff09;&#xff0c;并将其值改为UTF-8。保存文件并‌重启JMeter‌生效…...

额外篇 非递归之美:归并排序与快速排序的创新实现

个人主页&#xff1a;strive-debug 快速排序非递归版本 非递归版本的快速排序是为了解决在空间不够的情况下&#xff0c;利用栈来模拟递归的过程。 递归版本的快速排序是空间换时间&#xff0c;好实现。 实现思路&#xff1a; 1. 创建一个栈&#xff0c;将数组的右边界下标和…...

[文献阅读] EnCodec - High Fidelity Neural Audio Compression

[文献信息]&#xff1a;[2210.13438] High Fidelity Neural Audio Compression facebook团队提出的一个用于高质量音频高效压缩的模型&#xff0c;称为EnCodec。Encodec是VALL-E的重要前置工作&#xff0c;正是Encodec的压缩量化使得VALL-E能够出现&#xff0c;把语音领域带向大…...

JavaSpring 中使用 Redis

创建项目 配置 Redis 服务地址 创建 Controller 类 由于当前只是些简单的测试代码&#xff0c;所以就不进行分层了&#xff0c;只创建一个 Controller 来实现 jedis 通过 jedis 对象里的各种方法来操作 Redis 此处通过 StringRedisTemplate 来操作 Redis 最原始提供的类是 Re…...

B端可视化像企业数据的透视镜,看清关键信息

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据的价值不仅取决于其数量&#xff0c;更在于企业能否快速、准确地提取关键信息并据此做出决策。B端可视化技术的出现&#xff0c;为企业提供了一种强大的工具&#xff0c;它如同企业的“透视镜”&…...

【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

【MySQL】SQL语句在MySQL中的执行过程?主要存储引擎区别?

MySQL SQL语句执行过程详解 作为面试官&#xff0c;我来详细剖析一条SQL语句在MySQL中的完整执行过程&#xff0c;这是每个后端开发者都应该掌握的核心知识。 一、连接阶段 建立连接 客户端通过TCP/IP协议与MySQL服务器建立连接(默认3306端口)服务器验证用户名、密码和权限…...

致远OA——数据回填表单

文章目录 :apple: 业务需求描述:pineapple: 业务分析和实现 &#x1f34e; 业务需求描述 测试案例&#xff1a; https://pan.quark.cn/s/3f58972f0a27 官网地址&#xff1a; https://open.seeyoncloud.com/v5devCAP/94/355/359/399/405/406.html 需求描述&#xff1a; 点…...

MongoDB导出和导入数据

安装mongodump工具 参考文章mongodump工具安装及使用详解_mongodump安装-CSDN博客 MongoDB导入导出和备份的命令工具从4.4版本开始不再自动跟随数据库一起安装&#xff0c;而是需要自己手动安装。 官方网站下载链接&#xff1a;Download MongoDB Command Line Database Tools …...

蓝桥杯之递归二

1.数的划分 题目描述 将整数 nn 分成 kk 份&#xff0c;且每份不能为空&#xff0c;任意两份不能相同(不考虑顺序)。 例如&#xff1a;n7&#xff0c;k3n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 1&#xff0c;1&#xff0c;5;1&#xff0c;5&#xff0c;…...

【大疆dji】ESDK开发环境搭建(软件准备篇)

接上一篇【大疆dji】ESDK开发环境搭建&#xff08;硬件准备篇&#xff09; 1. 编译环境 ESDK 提供 x86_64/aarch64 基于 Linux 平台 Ubuntu 发行版操作系统构建的静态库&#xff0c;运行 demo 先正确安装所需的依赖包。arm32位就不支持了。建议使用编译安装的方式&#xff0c;…...

Android TTY设备调用流程和简单分析

Linux TTY系统中ioctl的调用流程详解:从应用层到MSM GENI Serial驱动 本文档详细分析Linux系统中从用户空间应用程序发起TTY ioctl请求到特定驱动(例如msm_geni_serial_ioctl)的完整调用流程,包括32位应用与64位内核之间的兼容性问题分析。 1. 总体调用路径概览 以下是完…...

数字孪生赋能管理系统,降本增效立竿见影

1. 数字孪生基础概念及其在管理系统中的应用前景 数字孪生是一种集成多学科、多物理量、多尺度、多概率的仿真过程&#xff0c;在虚拟空间中完成映射&#xff0c;从而反映相对应的实体装备的全生命周期过程。其核心在于将现实世界中的物理对象或系统与其数字化模型相结合&…...

Java学习手册:Web 应用架构概述

一、Web 应用架构的演变 在互联网发展的初期阶段&#xff0c;Web 应用普遍采用客户端 / 服务器&#xff08;C/S&#xff09;架构模式。客户端应用程序与服务器端应用程序直接建立连接&#xff0c;进行数据交互和业务处理。然而&#xff0c;这种架构存在诸多局限性。由于客户端…...

企业网站安装 SSL安装的必要性

能够带来安全的加密和快速的访问体验&#xff0c;防止中间人的流量劫持&#xff0c;保障用户隐私信息的安全&#xff0c;帮助用户识别钓鱼网站&#xff0c;提升网站在搜索引擎的排名。 能够防止黑客盗走客户银行卡账号的机密信息&#xff0c;保证信息的机密性&#xff0c;防止…...

【CF】Day38——Codeforces Round 965 (Div. 2) B

B. Minimize Equal Sum Subarrays 题目&#xff1a; 思路&#xff1a; 直觉题 我们可以这样构造&#xff0c;将整个数列左移一位即可&#xff0c;为什么呢&#xff1f; 因为这样我们能尽可能地保证数列的数字尽可能多的同时 且 有一个数不同 这里介绍一个rorate函数&#xf…...

leetcode 300. Longest Increasing Subsequence

目录 题目描述 第一步&#xff0c;明确并理解dp数组及下标的含义 第二步&#xff0c;分析明确并理解递推公式 第三步&#xff0c;理解dp数组如何初始化 第四步&#xff0c;理解遍历顺序 代码 题目描述 这是动态规划解决子序列问题的例子。 第一步&#xff0c;明确并理解…...

解密大模型背后的秘密:训练、优化与挑战

解密大模型背后的秘密&#xff1a;训练、优化与挑战 在当今的人工智能领域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已经成为了一个不可忽视的存在。从自然语言处理到图像生成&#xff0c;再到推荐系统&#xff0c;大模型以其强大的泛化能力和创…...

第33讲|遥感大模型在地学分类中的初探与实战

目录 🧠 一、什么是“遥感大模型”? 📚 二、遥感大模型在地学分类中的优势 📍三、案例:使用 Segment Anything Model (SAM) 进行遥感地物分割 📦 1. 安装与依赖配置(PyTorch) 🖼 2. 读取遥感图像(可用 Sentinel-2 伪彩色图) 🔧 3. SAM 模型载入 💡 …...

LeetCode 438 找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…...

【25软考网工笔记】第二章(6)脉冲编码调制PCM、通信和交换方式

目录 一、脉冲编码调制PCM 1. 脉冲编码调制的数字化过程 1&#xff09;采样 2&#xff09;量化 3&#xff09;编码 2. PCM计算 3. 应用案例 1&#xff09;例题1 2&#xff09;例题1 3&#xff09;例题3 知识小结 二、通信和交换方式 1.数据通信方式分类 1&#x…...

JSON学习笔记

文章目录 1. JSON是什么2. JSON的特点与结构3. JSON的使用4. JSON文件读取 1. JSON是什么 JSON&#xff08;JavaScript Object Notation&#xff0c;JavaScript对象表示法&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和…...

高阶指南:动态定价下eBay利润率控制的4维财务模型

在eBay平台上&#xff0c;动态定价&#xff08;Dynamic Pricing&#xff09;早已不是新鲜概念。随着市场供需的瞬时波动、竞争产品的变化&#xff0c;以及跨境电商红海局势的加剧&#xff0c;卖家若想在残酷的价格战中保住利润、稳住运营基本盘&#xff0c;仅靠经验主义已经远远…...

【NLP 66、实践 ⑰ 基于Agent + Prompt Engineering文章阅读】

你用什么擦干我的眼泪 莎士比亚全集 工业纸巾 还是你同样泛红的眼睛 —— 4.19 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt&#xff1a;用户传入的提示词&#xff08;如 “请分析这篇作文的主题”&#xff09;&#xff0c;指导模型执行任务 client&…...

Keil MDK中禁用半主机(No Semihosting)

在 ARM 编译器&#xff08;如 Keil MDK&#xff09; 中禁用半主机&#xff08;Semihosting&#xff09;并实现标准库的基本功能&#xff0c;需要以下步骤&#xff1a; 1. 禁用半主机 #pragma import(__use_no_semihosting) // 禁用半主机模式作用&#xff1a;防止标准库函数&…...

QML中的3D功能--纹理应用

Qt 3D 提供了强大的纹理支持,可以实现各种复杂的材质效果。以下是 Qt 3D 纹理开发的全面技术方案。 一、纹理处理的流程图 纹理处理关键步骤说明: 资源准备阶段 支持格式:PNG/JPG/KTX/DDS等 尺寸要求:建议2的幂次方(非强制) 纹理加载路径 qml Texture2D {source: "…...

LeetCode[459]重复的子字符串(KMP解法)

思路&#xff1a; 最近迷上了KMP算法&#xff0c;所以这道题也是来搞一下KMP算法&#xff0c;总所周知KMP是需要维护一个前缀表&#xff0c;KMP算法不是比较一个字符串包不包含另一个字符串的吗&#xff0c;这个重复字符串的题也能用&#xff1f;猫爷&#xff1a;毋庸置疑&…...

数据驱动未来:大数据在智能网联汽车中的深度应用

数据驱动未来:大数据在智能网联汽车中的深度应用 引言 随着智能网联汽车(Intelligent Connected Vehicles,ICV)的快速发展,数据已成为其核心驱动力。从实时交通数据到车辆传感器信息,大数据的深度应用正在让智能汽车更安全、更高效、更智能化。那么,大数据如何赋能智能…...

基于MCP的RAG系统实战:用Cursor+GroundX构建复杂文档问答引擎

在AI与文档处理的融合趋势下,基于MCP协议的RAG(Retrieval-Augmented Generation)系统为复杂文档的智能问答提供了全新解决方案。本文将详细解析如何通过Cursor编辑器(MCP客户端)与GroundX(MCP服务器)的组合,构建一个可处理科研文献、企业知识库的端到端问答系统,并提供…...

DSA数据结构与算法 4

第2章 排序技术 2.1 排序简介 排序是将数据按照特定顺序&#xff08;升序或降序&#xff09;排列的过程&#xff0c;它不仅是计算机科学中的基础操作&#xff0c;也是日常生活中不可或缺的工具。举个例子&#xff0c;想象一个图书馆里的书籍&#xff0c;如果这些书籍没有按照作…...

23种设计模式全解析及其在自动驾驶开发中的应用

一、创建型模式&#xff08;5种&#xff09; 目标&#xff1a;解耦对象创建过程&#xff0c;提升系统灵活性 模式名称核心思想典型场景自动驾驶应用示例工厂方法子类决定实例化对象类型日志系统、数据库连接器创建激光雷达/摄像头等传感器实例抽象工厂创建相关对象家族GUI组件…...

基于WiFi的智能教室数据监测系统的设计与实现

标题:基于WiFi的智能教室数据监测系统的设计与实现 内容:1.摘要 随着教育信息化的发展&#xff0c;对教室环境及设备数据监测的智能化需求日益增长。本文的目的是设计并实现一种基于WiFi的智能教室数据监测系统。方法上&#xff0c;采用WiFi模块实现数据的无线传输&#xff0c…...

Linux操作系统--环境变量

目录 基本概念&#xff1a; 常见环境变量&#xff1a; 查看环境变量的方法&#xff1a; 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式&#xff1a;​编辑 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 环境变量通常具有全局属性 基本概念…...

备份jenkins

jenkins用熟了很爽&#xff0c;jenkins用熟了很香&#xff0c;jenkins用熟了可以起飞…… 但~你们是否有过这种经历&#xff1f; 庚子年四月初一 路人甲小手一抖&#xff0c;不小心把配置删了&#xff0c;然后只能重新配置&#xff0c;再然后发现鬼记得太古时代都做了哪些配置…...