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

C语言指针下(进阶):核心考点与高频面试题解析

指针篇下进阶核心 面试高频考点全解析指针的基础内容上手后进阶部分才是掌握 C 语言核心、应对期末笔试和校招面试的关键。这篇把指针进阶的重点内容拆解清楚搭配可直接运行的代码示例没有晦涩的表述从易混概念到实战应用一步步吃透指针高阶用法。引言在指针基础篇中我们掌握了指针的本质、一维数组与指针的关联、基础的指针操作等内容而进阶部分则聚焦于字符指针的高阶用法、数组指针与指针数组的区分、二维数组传参、函数指针及回调函数这些核心考点还有标准库qsort的使用与模拟实现这些内容不仅是考试常考的重点也是实际开发和面试中高频问到的知识点。接下来的内容全程搭配实战代码所有示例均可直接复制运行帮大家把抽象的指针知识落地。一、字符指针变量面试高频核心考点字符指针char*是指针最常用的进阶场景专门用于指向字符串核心考察常量字符串的存储特性与内存规则基础篇仅涉及单个字符的指针指向本节为纯进阶内容。1. 指向常量字符串的核心特性C 语言没有专门的字符串类型字符串是以\0为结束标志的字符数组其中常量字符串如abcdef会被编译器存储在程序的只读数据区内容不可修改字符指针仅存储其首元素的地址。#include stdio.h int main() { // p仅存储常量字符串首字符a的地址非字符串整体赋值 const char* p abcdef; printf(%c\n, *p); // 解引用取首字符输出a printf(%s\n, p); // %s从首地址开始打印直到遇到\0结束输出abcdef // *p g; // 非法操作编译可通过但运行直接崩溃只读内存不可修改 return 0; }核心规范用const char*指向常量字符串是规范的写法能明确告知编译器与开发者 “此字符串内容不可修改”从语法层面规避误操作。2. 经典面试题字符数组 vs 字符指针这道题核心考察常量字符串的内存分配与编译器优化是笔试必考题型跑一遍代码就能清晰理解#include stdio.h int main() { // 字符数组——栈上分配两个独立内存空间存储相同字符串 char str1[] hello bit.; char str2[] hello bit.; // 字符指针——指向只读数据区的同一个常量字符串 const char* str3 hello bit.; const char* str4 hello bit.; // 比较的是数组首元素的地址两个独立内存地址不同 if (str1 str2) printf(str1 and str2 are same\n); else printf(str1 and str2 are not same\n); // 最终输出此行 // 编译器做常量合并优化两个指针指向同一块只读内存地址相同 if (str3 str4) printf(str3 and str4 are same\n); // 最终输出此行 else printf(str3 and str4 are not same\n); return 0; }核心结论需要修改字符串内容时用字符数组栈区内存可修改仅读取字符串内容时用字符指针无需额外拷贝字符串节省内存。二、数组指针变量基础篇已经讲解指针数组本质是数组元素为指针的基础定义本节为其易混进阶概念数组指针二者是笔试面试的核心区分考点记住优先级规则就能轻松分辨。1. 核心定义与格式数组指针是专门存储整个数组地址的指针本质是指针指向一段固定长度、指定类型的数组。定义格式数据类型 (*指针名)[数组长度];优先级规则() [] *(*指针名)先与括号结合明确其本质是指针再与[]结合表示指向的数组规格。示例int (*p)[5];→ 定义一个指针指向包含 5 个int类型元素的一维数组。2. 指针数组 vs 数组指针 核心区分写法本质核心判断优先级int *p[5]指针数组先结合[]是数组int (*p)[5]数组指针先结合()是指针3. 进阶应用指针数组模拟二维数组指针数组的核心进阶用法是模拟二维数组和真正的二维数组相比它支持指向不同长度的一维数组灵活性更高#include stdio.h int main() { // 定义3个独立的一维数组作为模拟二维数组的“行” int arr1[] { 1,2,3,4,5 }; int arr2[] { 2,3,4,5,6 }; int arr3[] { 3,4,5,6,7 }; // 指针数组每个元素都是int*存储3个一维数组的首地址 int* parr[3] { arr1, arr2, arr3 }; // 模拟二维数组的访问parr[i][j]等价于*(*(parr i) j) for (int i 0; i 3; i) { for (int j 0; j 5; j) { printf(%d , parr[i][j]); } printf(\n); } return 0; }运行结果1 2 3 4 5 2 3 4 5 6 3 4 5 6 7核心区别真正的二维数组内存是连续的而指针数组模拟的二维数组每个 “行” 是独立的一维数组内存不连续仅通过指针数组关联。三、二维数组传参的本质基础篇仅讲解了一维数组传参的本质二维数组传参是数组指针的核心应用场景也是面试高频考点记住三个核心规则就能掌握。1. 二维数组名的本质二维数组的本质是数组的数组例如int arr[3][5]表示一个包含 3 个元素的数组每个元素是一个包含 5 个int的一维数组。二维数组名arr代表数组首行的地址类型为数组指针int (*)[5]而非首元素地址。2. 二维数组传参的三大核心规则列号绝对不能省略编译器需要通过列号计算每一行的地址偏移arr[i][j] arr i*列数 j省略列号会直接编译报错行号可省略仅作代码提示无实际内存限制作用形参本质是数组指针三种写法完全等价。3. 二维数组传参的三种等价写法// 写法1完整二维数组形式行号列号 void fun(int arr[3][5], int row) {} // 写法2省略行号最常用简洁直观 void fun(int arr[][5], int row) {} // 写法3数组指针形式最推荐明确体现传参本质 void fun(int (*arr)[5], int row) {}4. 二维数组的数组指针访问实战#include stdio.h // 形参用数组指针接收二维数组的首行地址 void print(int (*p)[5], int r, int c) { for (int i 0; i r; i) { for (int j 0; j c; j) { // 两种完全等价的访问方式 // 方式1指针解引用 *(*(p i) j) // 方式2下标访问 p[i][j]语法糖更易读 printf(%d , p[i][j]); } printf(\n); } } int main() { int arr[3][5] { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} }; print(arr, 3, 5); // 二维数组名arr作为首行地址传入 return 0; }四、函数指针变量函数指针是 C 语言指针进阶的核心概念专门指向函数的入口地址是实现回调函数、函数指针数组的基础用简易计算器的实战代码来理解会非常直观。1. 函数地址的核心特性函数名本身就是函数的入口地址函数名与函数名完全等价都表示函数的地址这和数组名有本质区别#include stdio.h int Add(int x, int y) { return x y; } int main() { // 以下两行输出完全相同的地址Add与Add等价 printf(%p\n, Add); printf(%p\n, Add); return 0; }2. 函数指针实战简易计算器#define _CRT_SECURE_NO_WARNINGS #include stdio.h void Display() { printf( 简易计算器 \n); printf(1. 加法 () 2. 减法 (-)\n); printf(3. 乘法 (*) 4. 除法 (/)\n); printf(0. 退出程序\n); printf(\n); } // 四则运算核心函数 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 a, int b) { // 防除数为0异常 if (b 0) { printf(错误除数不能为0\n); return -1; } return a / b; } // 函数指针作为参数统一调用逻辑 void calc(int (*p)(int, int)) { int a, b; printf(请输入两个操作数空格分隔); scanf(%d%d, a, b); // 单独处理除法异常 if (p div b 0) return; printf(运算结果%d\n\n, p(a, b)); } int main() { int input 1; do { Display(); printf(请选择操作0-4); scanf(%d, input); switch (input) { case 1: calc(add); break; case 2: calc(sub); break; case 3: calc(mul); break; case 4: calc(div); break; case 0: printf(退出程序\n); break; default: printf(输入无效请重新选择\n\n); break; } } while (input); return 0; }3. 核心知识点解析函数指针定义int (*p)(int, int)表示指针p指向「接收两个 int 参数、返回 int 的函数」调用方式p(a,b)与(*p)(a,b)完全等价前者更简洁编译器会自动解析实际开发中给函数指针传参能有效统一调用逻辑减少冗余代码。五、函数指针数组与转移表用switch实现的计算器会有大量冗余的条件判断而函数指针数组转移表能直接通过下标调用函数代码更简洁、扩展性更强是实际开发中常用的技巧。1. 转移表版计算器优化后#define _CRT_SECURE_NO_WARNINGS #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 a, int b) { if (b 0) { printf(错误除数不能为0\n); return -1; } return a / b; } // 空函数处理非法输入 int empty(int a, int b) { printf(输入无效\n); return 0; } int main() { int a, b, op; // 函数指针数组转移表下标0-4对应空/加/减/乘/除 int (*calc[5])(int, int) { empty, add, sub, mul, div }; while (1) { printf(\n 转移表计算器 \n); printf(1.加 2.减 3.乘 4.除 0.退出\n); printf(请选择操作); scanf(%d, op); if (op 0) { printf(退出程序\n); break; } if (op 0 || op 4) { printf(输入错误\n); continue; } printf(请输入两个操作数); scanf(%d%d, a, b); // 下标直接调用无需switch/if判断 if (op ! 4 || b ! 0) { printf(结果%d\n, calc[op](a, b)); } } return 0; }2. 核心优势扩展性极强新增功能如取模运算时只需新增函数并将地址加入转移表无需修改原有业务逻辑代码更简洁消除大量重复的case判断可读性更高访问效率高数组下标访问的时间复杂度为 O (1)比switch的条件判断更高效。六、回调函数回调函数是 C 语言实现函数解耦的核心手段也是标准库qsort的核心原理简单来说回调函数就是 “自己定义的函数通过函数指针传给其他函数由其他函数在合适的时机调用”。1. 回调函数实战qsort 排序学生信息按姓名 / 年龄#define _CRT_SECURE_NO_WARNINGS #include stdio.h #include string.h #include stdlib.h // 学生结构体定义 struct student { char name[10]; int age; }; // 回调函数1按姓名字典序升序 int cmp_student_name(const void* x, const void* y) { return strcmp(((const struct student*)x)-name, ((const struct student*)y)-name); } // 回调函数2按年龄升序 int cmp_student_age(const void* x, const void* y) { return ((const struct student*)x)-age - ((const struct student*)y)-age; } // 打印学生信息 void print_student(struct student a[], int len) { for (int i 0; i len; i) { printf(姓名%s年龄%d\n, a[i].name, a[i].age); } printf(-------------------------\n); } int main() { // 初始化学生数据 struct student a[] { {张三, 20}, {李四, 19}, {王五, 21} }; int len sizeof(a) / sizeof(a[0]); printf(原数据\n); print_student(a, len); // 按姓名排序传入姓名比较的回调函数 qsort(a, len, sizeof(struct student), cmp_student_name); printf(按姓名排序后\n); print_student(a, len); // 按年龄排序传入年龄比较的回调函数 qsort(a, len, sizeof(struct student), cmp_student_age); printf(按年龄排序后\n); print_student(a, len); return 0; }2. 运行结果原数据 姓名张三年龄20 姓名李四年龄19 姓名王五年龄21 ------------------------- 按姓名排序后 姓名李四年龄19 姓名王五年龄21 姓名张三年龄20 ------------------------- 按年龄排序后 姓名李四年龄19 姓名张三年龄20 姓名王五年龄21 -------------------------3. 回调函数核心规则qsort的比较函数必须遵循固定的接口int (*)(const void*, const void*)保证通用性返回值规则返回值 0第一个元素排在第二个元素前面返回值 0两个元素顺序不变返回值 0第一个元素排在第二个元素后面const void*的使用保护原数据不被修改使用时需强制转换为对应的数据类型。七、标准库 qsort 通用排序函数qsort是 C 语言标准库stdlib.h的通用排序函数基于快速排序实现支持任意类型数据int、字符串、结构体的排序其通用性的核心就是void*通用指针 回调函数。1. qsort 函数原型void qsort( void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *) );2. 参数全解析参数含义void *base待排序数据的首地址void*为通用指针可接收任意类型数据的地址size_t nitems待排序的元素个数size_t为无符号整数类型size_t size单个元素的字节大小int (*compar)(const void *, const void *)比较函数的函数指针回调函数由用户自定义排序规则八、qsort 函数的模拟实现为了彻底理解qsort的通用排序原理我们基于冒泡排序逻辑简单适合模拟实现自定义的通用排序函数my_qsort核心是void*通用指针 回调函数 逐字节交换这也是面试中的高频编程题。1. 自定义 my_qsort 完整可运行代码#define _CRT_SECURE_NO_WARNINGS #include stdio.h #include string.h // 通用交换函数逐字节交换支持任意类型数据 void Swap(char *buf1, char *buf2, size_t size) { for(size_t i 0; i size; i) { char temp *buf1; *buf1 *buf2; *buf2 temp; buf1; buf2; } } // 模拟qsort基于冒泡排序的通用排序函数 void my_qsort(void* a, int count, int size, int(*point)(void* a, void* b)) { for (int i 0; i count - 1; i) { for (int j 0; j count - 1 - i; j) { if (point((char*)a size * j, (char*)a size * (j 1)) 0) { _swap((char*)a j * size, (char*)a (j 1) * size, size); } } } } // 测试复用学生排序的回调函数 struct student { char name[10]; int age; }; int cmp_student_age(const void* x, const void* y) { return ((const struct student*)x)-age - ((const struct student*)y)-age; } void print_student(struct student a[], int len) { for (int i 0; i len; i) { printf(姓名%s年龄%d\n, a[i].name, a[i].age); } } int main() { struct student a[] { {张三, 20}, {李四, 19}, {王五, 21} }; int len sizeof(a) / sizeof(a[0]); printf(自定义qsort按年龄排序后\n); my_qsort(a, len, sizeof(struct student), cmp_student_age); print_student(a, len); return 0; }2. 核心实现原理void*通用指针可接收任意类型数据的首地址但不能直接解引用、不能直接做地址运算强转char*做地址偏移char*的步长为 1 字节能通过(char*)base j*size精准计算任意类型元素的地址逐字节交换不管是 int、结构体还是其他类型都能通过遍历字节完成交换实现通用的交换逻辑回调函数解耦排序的比较规则由用户自定义的回调函数决定实现了排序逻辑与数据类型的解耦。九、sizeof 与 strlen 的核心差异面试必考sizeof和strlen是 C 语言极易混淆的两个标识符基础篇仅零散使用二者的核心差异是笔试面试的基础必考题一张表就能清晰区分。1. 核心差异对比表特性sizeofstrlen本质C 语言关键字 / 操作符C 语言标准库函数需包含 string.h计算内容变量 / 类型占用的内存字节数字符串有效字符个数不含结束符\0结束标志无需结束标志直接计算内存总大小必须以\0为结束标志遇到\0立即停止操作对象任意类型变量、数组、指针、类型名仅能操作字符串char*/ 字符数组计算时机编译期计算结果为常量运行期计算结果为变量返回值类型size_t无符号整数size_t无符号整数2. 经典示例代码#include stdio.h #include string.h int main() { char str[] abcdef; char *p str; char str2[10] abc; printf(sizeof(str) %zd\n, sizeof(str)); // 76个字符1个\0 printf(strlen(str) %zd\n, strlen(str)); // 6有效字符不含\0 printf(sizeof(p) %zd\n, sizeof(p)); // 864位系统指针大小固定 printf(sizeof(str2) %zd\n, sizeof(str2)); // 10数组总内存大小 printf(strlen(str2) %zd\n, strlen(str2)); // 3遇\0停止 return 0; }十、经典指针笔试题解析指针笔试题综合考察数组名的本质、指针运算规则、sizeof/strlen的使用也是面试的压轴考点下面这道指针 位运算的经典题是校招中高频出现的题型。1.题型找数组中唯一出现一次的两个数字#include stdio.h // 找出数组中只出现一次的两个数字其余数字出现两次 void findSingleNumbers(int* a, int n, int* res) { if (a NULL || res NULL || n 2) { printf(输入参数无效\n); return; } int sum 0; int* p a; for (int i 0; i n; i, p) { sum ^ *p; } int mask 1; while ((sum mask) 0) { mask 1; } int x 0, y 0; p a; for (int i 0; i n; i, p) { if (*p mask) { x ^ *p; } else { y ^ *p; } } *res x; *(res 1) y; } int main() { int a[] { 1, 2, 3, 4, 5, 1, 2, 3, 4, 6 }; int n sizeof(a) / sizeof(a[0]); int res[2]; findSingleNumbers(a, n, res); printf(数组中只出现一次的两个数字是%d 和 %d\n, res[0], res[1]); return 0; }2.运行结果数组中只出现一次的两个数字是5 和 63.核心思路利用异或特性相同数字异或结果为 00 异或任意数字结果为该数字本身将数组中所有数字异或后结果为两个目标数字的异或值找到异或结果中第一个为 1 的二进制位该位表示两个目标数字在这一位上不同以此为依据将数组分为两组分组异或将两组数字分别异或最终得到的两个结果就是数组中只出现一次的两个数字指针操作通过指针遍历数组p的步长由指针类型决定此处为 int*步长 4 字节精准访问每个数组元素。十一、核心总结复杂指针类型的区分核心是优先级规则() [] *先结合的标识符决定其本质先结合()是指针先结合[]是数组void*是 C 语言的通用指针可接收任意类型地址是实现通用编程的核心需强转为char*后才能做地址运算回调函数是 C 语言实现函数解耦的关键标准库qsort的通用性正是基于void*通用指针 用户自定义回调函数实现二维数组传参列号不可省略形参本质是数组指针这是与一维数组传参的核心区别sizeof是编译期计算内存大小的操作符strlen是运行期计算字符串长度的库函数二者无关联切勿混淆指针运算仅支持 ± 整数、指针 - 指针、关系运算 指针 指针、乘除运算均为非法操作指针 ± 整数的步长由指针类型决定。十二、指针上下篇整体衔接指针基础篇围绕指针的本质内存地址、基础操作、一维数组与指针的关联展开是理解指针的基础进阶篇则聚焦复杂指针类型、通用编程思想、面试高频考点是对指针知识的综合应用和深化。二者结合构成了 C 语言指针的完整知识体系而贯穿始终的核心底层逻辑不变指针的本质是内存地址指针的类型决定了解引用的权限和运算的步长。所有示例代码均可直接复制到编译器运行建议动手敲一遍、修改参数尝试不同的效果只有通过实际操作才能真正把指针的知识点吃透应对考试和面试也会更得心应手。

相关文章:

C语言指针下(进阶):核心考点与高频面试题解析

指针篇(下):进阶核心 面试高频考点全解析指针的基础内容上手后,进阶部分才是掌握 C 语言核心、应对期末笔试和校招面试的关键。这篇把指针进阶的重点内容拆解清楚,搭配可直接运行的代码示例,没有晦涩的表述…...

【自定义控件】温度表/压力表仪表盘,纯GDI绘制多场景应用控件示例(很漂亮哦)

近期开发的自定义控件一览表,仅供学习参考2026.3.16 更新 20多种控件。刻度尺、带进度条刻度尺、仪表、温湿度表、加油面板、速度表、时钟等 一、控件1效果显示二、控件2展示(半圆形)功能(以最终效果为准,功能不断优化…...

基于BIP+qwenCode+BIPMCP的客户化开发最佳实践

基于BIPqwenCodeBIPMCP的客户化开发最佳实践 前言 本案例出于通用性考虑,使用BIP旗舰版演示,实际使用过程中旗舰版,高级版均可使用此方法 功能说明 本案例将结合BIP旗舰版低代码平台qwenCodeBIPMCP进行rest接口开发 相关资料 文档 启动本…...

GLM-5:当大模型学会“自己写代码“,从Vibe Coding到Agentic Engineering的跨越

GLM-5:当大模型学会"自己写代码",从Vibe Coding到Agentic Engineering的跨越 🎯 一句话总结:智谱AI联合清华大学推出744B参数的GLM-5模型,通过DeepSeek Sparse Attention(DSA)压缩注意…...

OpenClaw详细版配置教程

1. 简介 openClaw就是一个开源的AI助手项目,接下来介绍一下windows系统的本地部署教程。 2. 步骤 由于官方推荐在windows系统中使用WSL2运行openclaw。原因是windows也可以运行,但某些插件可能出现兼容性不足的问题,问题比较多;而…...

uniapp中 不铺满全屏滚动加载更多

uniapp中 滚动加载更多 搜索框的部分固定不动 下部分下拉加载更多添加 scroll-view<scroll-view v-if"list.length > 0" class"itempages" scroll-y"true" scrolltolower"loadMore" style"height: 63vh;"> <…...

Linux进程 --- 5(进程地址空间初识)

大家好&#xff01;今天我们将深入探讨进程地址空间的相关知识&#xff0c;同时也会解答之前文章中遗留的一些问题。相信通过这篇文章的学习&#xff0c;大家一定能有所收获&#xff01;历史问题引入在前面文章中我们介绍了fork函数&#xff0c;有如下的形式&#xff1a;pid_t …...

揭秘五轴数控磨床的坐标魔术:砂轮轴向如何随工件旋转?

在高端制造领域,五轴数控磨削机床是实现复杂曲面精密加工的核心装备。其魅力在于通过多轴联动,让砂轮与工件在三维空间中自由“共舞”,从而啃下叶轮、螺旋桨等硬骨头。然而,这场舞蹈的幕后指挥——坐标变换,却是一道让许多工程师头疼的数学谜题。今天,我们将深入拆解一个…...

Gitee本地项目上传及下载教程

1.Gitee仓库创建 ①登录Gitee官网&#xff0c;在首页右上角选择加号&#xff0c;点击新建仓库。 ②配置仓库 选择【初始化仓库】 ----【设置模板】----【选择分支模型】&#xff0c;其他的默认 注&#xff1a;【.gitignore一项&#xff0c;建议默认不选择状态】容易在本地项目上…...

Linux 进程控制(四)自主Shell命令行解释器.

目录 自主Shell命令行解释器 第1步 : 打印命令行字符串 第2步 : 从键盘中获取用户的字符串输入 第3步 : 解析命令行字符串 第4步 : 利用程序替换函数执行解析完的命令 第 5 步 : 内建命令的特殊处理 第6步 : 解析重定向命令 自主Shell命令行解释器 在前面学习完进程的创…...

在资源优化调度场景中,基于多源数据(如地磁/视频/雷达检测、浮动车GPS、手机信令、互联网地图API等)构建关联规则

在资源优化调度场景中&#xff0c;基于多源数据&#xff08;如地磁/视频/雷达检测、浮动车GPS、手机信令、互联网地图API等&#xff09;构建关联规则&#xff0c;可实现对城市交通系统的动态感知与协同优化。其核心逻辑包括&#xff1a;多源数据融合建模&#xff1a;通过时空对…...

基于VSG控制的MMC并网逆变器仿真模型(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Ambari Metrics 是 Apache Ambari 提供的轻量级、嵌入式集群监控子系统,用于收集、聚合、存储和展示 Hadoop 生态组件

Ambari Metrics 是 Apache Ambari 提供的轻量级、嵌入式集群监控子系统&#xff0c;用于收集、聚合、存储和展示 Hadoop 生态组件&#xff08;如 HDFS、YARN、HBase、Kafka 等&#xff09;的关键性能指标&#xff08;Metrics&#xff09;。它基于时间序列数据库&#xff08;默认…...

Apache Hadoop 生态系统(或与其深度集成)的企业级大数据平台核心服务,常见于 Hortonworks Data Platform(HDP)、Cloudera Data Platform

Apache Hadoop 生态系统&#xff08;或与其深度集成&#xff09;的企业级大数据平台核心服务&#xff0c;常见于 Hortonworks Data Platform&#xff08;HDP&#xff09;、Cloudera Data Platform&#xff08;CDP&#xff09;等发行版中&#xff0c;各自承担关键职能&#xff1…...

手机短信误删!4 个实用恢复方法,一文看懂轻松

你是否有过这样的懊恼时刻&#xff1a;手滑删除了银行的验证码短信&#xff0c;或是亲友的珍贵问候&#xff0c;急需时才发现信息已消失无踪&#xff1f;其实&#xff0c;被删除的短信并不会立刻从手机中彻底清除&#xff0c;只是被系统标记为 “可覆盖空间”—— 这个特性为恢…...

每天了解几个MCP SERVER:工具百宝箱!200+应用集成,Composio 让 AI 连接一切

每天了解几个MCP SERVER&#xff1a;&#x1f527; Composio来源: https://docs.composio.dev/docs/mcp-overview简介 Composio MCP Server 提供200工具集成平台&#xff0c;让AI可以连接各种第三方应用和服务。 能做什么 工具集成&#xff1a;200应用集成工作流编排&#xff1…...

每天了解几个MCP SERVER:云端媒体库!AI 自动处理图片视频,Cloudinary 让媒体管理更简单

每天了解几个MCP SERVER&#xff1a;&#x1f5bc;️ Cloudinary来源: https://github.com/cloudinary/mcp-servers简介 Cloudinary MCP Server 提供云端图片管理和CDN服务&#xff0c;让AI可以进行图片上传、处理和优化。 能做什么 图片上传&#xff1a;上传图片和视频图片处理…...

每天了解几个MCP SERVER:极速分析神器!亿级数据秒级查询,ClickHouse 让大数据分析飞起

每天了解几个MCP SERVER&#xff1a;⚡ ClickHouse来源: https://github.com/ClickHouse/mcp-clickhouse简介 ClickHouse MCP Server 为AI Agent提供ClickHouse列式数据库的查询能力&#xff0c;以极高的性能分析大数据。 能做什么 SQL查询&#xff1a;执行高性能SQL查询实时分…...

刷题笔记:力扣第48题-旋转图像

1.拿到这道题目&#xff0c;第一反应是再创建一个新的矩阵&#xff0c;按照顺时针旋转90的方式遍历原来的矩阵&#xff0c;将旋转后的矩阵存入新矩阵中&#xff0c;输出即可。这种方法的时间复杂度和空间复杂度均为O(n2)。2.但本题不允许使用新的矩阵&#xff0c;这意味着一切修…...

OpenClaw使用教程 + 获取API + 踩坑

新手建议&#xff1a;如果研究不下去&#xff0c;直接用第三方的Oneclaw&#xff0c;字节、阿里、腾讯出品的第三方。 可以等一等&#xff0c;国产有替代。 别焦虑&#xff0c;没用&#xff0c;23年gpt&#xff0c;24年sora&#xff0c;25deepseek和agent&#xff0c;26开年o…...

免费查AI率完全攻略:5种不花钱的检测方法

免费查AI率完全攻略&#xff1a;5种不花钱的检测方法 写完论文之后最怕什么&#xff1f;不是导师让你改格式&#xff0c;而是交上去才发现AI率高得离谱。现在各高校对AI率查得越来越严&#xff0c;知网、维普、万方都上了AIGC检测模块&#xff0c;一旦被标记"疑似AI生成&q…...

免费降AI率软件排行:从白嫖到付费怎么选

免费降AI率软件排行&#xff1a;从白嫖到付费怎么选 写这篇文章的起因是&#xff0c;上个月有三个不同的朋友问了我同一个问题&#xff1a;“有没有免费降AI率的软件&#xff1f;” 一个是大四写毕业论文的&#xff0c;一个是在读研二准备投期刊的&#xff0c;还有一个是帮老板…...

毕业论文免费查AI率+降AI率一站式攻略

毕业论文免费查AI率降AI率一站式攻略 答辩季快到了&#xff0c;论文的事情一件接一件。查重过了还有AI检测&#xff0c;AI检测过了还有格式审查&#xff0c;感觉毕业比入学还难。 这篇文章解决一个具体问题&#xff1a;怎么用免费工具完成论文AI率的检测和修改。从"查出来…...

免费降ai工具实测:哪个免费额度最良心

免费降ai工具实测&#xff1a;哪个免费额度最良心 网上但凡说"免费"两个字的工具&#xff0c;十个里有八个是标题党。要么注册完发现免费额度只有100字&#xff0c;跟没有一样&#xff1b;要么做一堆任务才能解锁&#xff0c;转发三个群、邀请两个好友&#xff0c;折…...

HJ132 小红走网格

中等 通过率&#xff1a;31.75% 时间限制&#xff1a;1秒 空间限制&#xff1a;1024M 知识点数论 校招时部分企业笔试将禁止编程题跳出页面&#xff0c;为提前适应&#xff0c;练习时请使用在线自测&#xff0c;而非本地IDE。 描述 在二维平面坐标系中&#xff0c;小红初…...

2026 学术诚信必备!10 款 AI 论文查重工具盘点:查重 + AI 率双检测,告别毕业 / 投稿焦虑

又到本科毕设、期刊投稿的关键节点&#xff0c;「重复率飘红」「AI 率超标」成了悬在每一位学术人头顶的达摩克利斯之剑。传统查重工具只能检测文字重复&#xff0c;面对 AI 生成内容却束手无策&#xff1b;而专业 AI 检测又价格高昂、操作繁琐。 今天为大家整理了10 款兼顾查…...

在服务器上通过git仓库进行多开发者协同工作

本文旨在解决一个需求&#xff1a;在同一服务器上的若干个开发人员能够在自己的账户下面抓取和更新一个项目文件夹。1.首先是root权限创建git仓库&#xff1a;创建用于共享的裸仓库&#xff1a;git clone --bare 项目文件夹名 项目文件夹名.git创建用户组&#xff1a;sudo grou…...

C语言程序设计第四版(何钦铭、颜晖)第八章指针之拆分实数的整数与小数部分

1. 拆分实数的整数与小数部分:要求自定义一个函数 void splitfloat (float x, int* intpart,float *fracpart);其中x是被拆分的实数,*intpart和*fracpart分别是将实数x拆分出来的整数部分与小数部分。编写主函数,并在其中调用函数splitfloat()。试编写相应程序。#include<st…...

苍穹外卖WebSocket连接问题

在调试过程中发现&#xff0c;当前端应用部署在Nginx下访问localhost时&#xff0c;WebSocket连接无法建立&#xff1b;而直接运行前端项目时则可以正常连接。通过浏览器F12排查问题后&#xff0c;发现是WebSocket的URL路径不同&#xff1a;我们实际需要的地址为ws://localhost…...

c++ 类和对象(全)

本文只是把之前上中下三篇文章集合了起来&#xff0c;后面跟着补充一点示例代码&#xff0c;也只是为了方便大家一下子全部观看。 类和对象&#xff08;上&#xff09; 一.类的定义 1.类定义格式 我们可以先看一个类的例子(栈)&#xff1a; class Stack { private:int* a;in…...