新闻详情

新闻详情

首页 / 资讯中心 / 详情

C语言二次学习攻略:函数、数组与指针重点突破

发布时间:2026/9/26 14:11:03来源:尧图网络
C语言二次学习攻略:函数、数组与指针重点突破
1. 第二次学习C语言为什么4到6章是先啃的骨头C语言我前后学过两遍第二次重学最用力啃的就是第4到第6章。这不是固定的教材页码而是大多数C语言课程里最容易卡人的三块函数、数组、指针顺手把字符串和内存管理也卷了进来。第一次学的时候这几个章节我是靠考前突击背下来的结果工作后写单片机固件被别人问了一句“单片机C语言没有堆栈吗”当场语塞。于是我把教材翻出来从头把4到6章重学了一遍。这篇经验整理就是给同样学第二遍、或者第一遍刚学完但觉得“像没学一样”的朋友参考的。1.1 第一次学C最容易倒在哪个阶段第一遍学C语言时我大致经历了“hello world的兴奋、printf格式符的烦躁、if/for/while的自信、数组下标的神奇、指针的崩溃”。前3章的内容还能靠样例代码刷存在感到了函数、数组、指针这一大块就变成“老师讲的时候听懂了自己写的时候空白”。这是很典型的第二遍学员画像懂一点语法缺的是组织程序的思维。为什么这一块容易懵因为它不再是一行一句的语法问题而是程序的组织方式和数据在内存里的流动方式。函数要理解调用和返回、参数传递、栈帧的压入弹出数组要理解连续内存、下标访问、越界风险指针要理解“地址”这个抽象级。三者在很多例子里还是混着出现的比如“数组名作为函数参数”本质就是传指针。第一次学如果没有亲手画过内存图基本就是靠记性硬撑撑到指针就开始塌方。1.2 4到6章是C语言从“玩具”到“工具”的分水岭第4到6章为什么值得重学因为后续几乎所有真需求都建立在这三块上链表要结构体和指针文件读写要缓冲区指针和字符串处理单片机外设驱动需要指针访问寄存器算法题里的排序和查找也离不开数组和函数封装。如果4到6章没打通后面的链表、文件、数据结构就只能继续靠背。第二次学的时候我给自己定了一个原则每一小节都必须留下一段可运行的代码而不是课本上的黑体字。函数学完手写一个“计算某天是第几天”的拆分数组学完手写一个冒泡排序指针学完手写一个用指针遍历字符串并逆序输出的例程。代码量不大但每一段都逼着我把“看懂了”变成“写出来了”。这是第二次学习最大的不同——第一次是“哦原来如此”第二次是“来我自己写一个”。1.3 给二次学习者的整体路线图第二次学习建议这样安排第1轮快速过掉基础语法重点做输入输出和分支循环练习第2轮主攻函数加数组用函数封装数组处理逻辑第3轮把指针、字符串、内存放在一起用指针视角把数组和函数重新看一遍第4轮再碰结构体、链表和文件做一个综合性的小管理系统。这其实就是把4到6章放在中间轮次。先有函数和数组的肌肉记忆再上指针才不会一步掉坑。下面我按实际学习的顺序把这几块硬骨头拆开聊。2. 函数与程序结构先学会把代码拆成能复用的积木2.1 函数定义、调用与返回值的底层套路C语言的函数至少要搞懂三件事声明、定义、调用。很多人第一次学的时候只记了格式返回类型 函数名(参数列表) { 函数体 }但没搞清楚为什么要分声明和定义。声明告诉编译器“有这个函数参数和返回值长这样”定义才给出具体实现。如果你把定义写在使用位置之后又不加声明有的编译器会警告甚至报错。这背后是C语言“先声明后使用”的编译规则。第二次学时建议养成习惯头文件里放声明源文件里放定义使用前include声明。调用函数时实际发生的是栈帧的创建与销毁。主调函数把实参值拷贝给形参然后跳转到被调函数执行完return后栈帧回退控制权交回调用处。这就是为什么普通参数传递叫“值传递”在函数里改形参不会影响实参。如果想修改实参就得把变量的地址传过去这就是后面指针的真正用武之地。第一次学函数时不必把栈讲得多深但至少要明白“函数调用是什么时候把控制权交回去的”。2.2 局部变量、全局变量与static的坑很多初学者喜欢把所有变量定义在main开头甚至干脆都用全局变量因为写起来方便。但全局变量带来的问题是耦合太强任何一个函数都可以改它出了问题不好定位。第二次学函数时要刻意练习“变量尽量局部化”。static有两条语义修饰局部变量时让变量在第一次进入函数时初始化一次之后函数退出也不释放再次调用仍保留上次的值修饰全局变量或函数时则把作用域限制在当前源文件。新手最容易混淆的是“static局部变量”和“全局变量”。调试计数器时经常出现“为什么每次调用都重置了”——那是没用static或者相反“为什么我的计数器一直被污染”——那是用了全局变量。举个例子#include stdio.h int counter() { static int count 0; // 只会初始化一次 count; return count; } int main() { for (int i 0; i 5; i) { printf(%d , counter()); } return 0; }运行结果是 1 2 3 4 5。如果把static去掉每次调用都重新初始化为0输出就变成 1 1 1 1 1。这个例子我用“改一行代码跑一下”的方式记了十年比任何概念背诵都管用。2.3 实战用函数优化“计算某天是这一年的第几天”搜索热词里有一条很典型“输入一个日期的年、月、日计算并输出这天是该年的第几天要求用两种方法优化”。这道题特别适合检验函数拆解。我第一次写的时候一个main搞定后面维护起来搞得自己头大。第二次改成函数版#include stdio.h int isLeap(int year) { return (year % 4 0 year % 100 ! 0) || (year % 400 0); } int daysOfMonth(int year, int month) { int days[] {31,28,31,30,31,30,31,31,30,31,30,31}; if (month 2 isLeap(year)) return 29; return days[month - 1]; } int dayOfYear(int year, int month, int day) { int total 0; for (int m 1; m month; m) { total daysOfMonth(year, m); } return total day; } int main() { int y, m, d; scanf(%d %d %d, y, m, d); printf(%d\n, dayOfYear(y, m, d)); return 0; }这样拆的好处是每个函数只干一件事。isLeap管闰年判断daysOfMonth管每月天数dayOfYear管累计。如果后面要改成输出“星期几”或者加上“距元旦还有多少天”你只需要新增一个函数没必要动主体逻辑。第二种优化思路是提前把“平年每月累计天数”存成数组再用“是否是闰年且月份大于2”加1。这种做法的本质是空间换时间。很多翁恺练习题和PTA题目都在考察这种“从重复计算到查表”的优化思路特别适合反复写。2.4 函数这部分必须亲手练的技能点函数这部分除了基础语法还有几个技能点必须亲手练函数原型和定义分离函数返回局部变量的问题绝对不能返回局部非static数组或局部变量的地址函数递归要会写“倒序打印数字”和“斐波那契”但也要清楚递归深度受栈限制把“打印九九乘法表”封装成函数这是最好的热身题。递归这块我第一次学基本是靠记忆。第二次我画了调用图终于明白return之后上一层还会继续执行。不过我要提醒一点在单片机上不要随便深递归后面还要专门说堆栈。3. 数组与字符串批量数据和字符的底层真相3.1 数组是连续内存越界不会直接报错C语言数组的底层模型很简单一段连续的内存通过下标计算偏移量。也因此数组下标从0开始a[0]在起始地址a[n]就是跳过n个元素大小的位置。这个简单模型衍生出两个关键点。第一数组名在大多数表达式中会退化成首元素的指针。这句话是“数组参数”问题的根源。当你写 void foo(int arr[]) 时形参arr本质是一个int *所以在函数内部用sizeof(arr)只能得到指针大小得不到数组大小必须额外传入长度。这是C语言新手必踩的坑也是“数组”和“指针”的第一次纠缠。第二数组越界不报错但很危险。a[i]的访问本质是“基地址 i乘元素大小”的内存访问编译器基本不会替你做下标范围检查。越界读可能读到脏数据越界写可能覆盖其他变量、使程序崩溃或出现神秘bug。第二次学数组时建议所有循环都用 i 长度 而不是 i 长度-1从习惯上规避越界。3.2 字符串不是类型而是以\0结尾的字符数组C语言里没有原生字符串类型字符串就是“以\0结尾的字符数组”。这里最核心的是结尾的\0它的ASCII值是0用来标记字符串结束。许多字符串函数的实现就是遍历直到遇到\0所以如果没有这个结束符strlen、strcpy、printf(%s)都会一直往后读内存直到碰见一个0为止。常用字符串处理函数里strcpy/strcat是不安全的因为它们不检查目标缓冲区大小。如果在任务里可以自行选择我推荐优先用安全版本用fgets(str, size, stdin)代替gets用snprintf代替sprintf自己手动实现“复制”“拼接”“逆序”时记得留出\0的位置。fgets是热词里很常见的函数用法是 fgets(char *str, int size, FILE *stream)。它最多读取size-1个字符并在末尾自动加\0同时会把换行符读进来。很多人第一次用fgets返回的字符串带了一个\n处理输入时经常要手动去掉尾部换行str[strcspn(str, \n)] 0;这一行代码值得记下来。fscanf和fprintf也经常一起出现。它们和scanf/printf的区别只是多了一个文件流参数。fscanf读取时容易遇到“读到最后一行无法判断是否结束”的问题建议用 while(fscanf(fp, %d, n) 1) 这种写法而不是只在循环体里读一次。3.3 必做题冒泡排序、字符串逆序、按空格分隔搜索热词里有“冒泡排序c语言”、“字符串逆序c语言pta”、“c语言将一个字符串按照里面的空格分开”。这三道题基本可以覆盖数组和字符串的重点。冒泡排序的C语言标准写法#include stdio.h void bubbleSort(int arr[], int n) { for (int i 0; i n - 1; i) { for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int t arr[j]; arr[j] arr[j 1]; arr[j 1] t; } } } } int main() { int a[] {5, 2, 8, 1, 9}; int n sizeof(a) / sizeof(a[0]); bubbleSort(a, n); for (int i 0; i n; i) { printf(%d , a[i]); } return 0; }注意 sizeof(a)/sizeof(a[0]) 这个表达式只能在数组定义所在的函数里用传进函数后就不行了。字符串逆序比如PTA那类题目有两种常见思路一种是原地双指针交换一个从头一个从尾另一种是复制到新数组再反向读。双指针更省内存也更考察指针功底#include stdio.h #include string.h void reverse(char s[]) { int i 0, j strlen(s) - 1; while (i j) { char t s[i]; s[i] s[j]; s[j] t; i; j--; } } int main() { char s[100]; fgets(s, sizeof(s), stdin); s[strcspn(s, \n)] 0; reverse(s); puts(s); return 0; }按空格把字符串分割成单词可以用strtok函数但strtok会修改原字符串并且把空格变成\0。更好的做法是自己用一个指针扫描char *p str; while (*p) { if (*p ) { p; continue; } char *start p; while (*p *p ! ) p; // 此时 [start, p) 是一个单词 for (char *q start; q p; q) putchar(*q); putchar(\n); }这种写法不需要引入额外库也顺便练了指针。字符串这章的题一定要自己用指针方式写一遍因为后面链表、树全是这种“用一个遍历指针不断移动”的思维。3.4 数组与字符串的常见错误速查这里列一下我在练习中踩过的问题现象原因解决字符串打印出现乱码字符数组没有 \0 或空间不够初始化时预留结束符空间或用 memset 清零fgets 读入后多一个换行fgets 会保留换行符用 strcspn 去掉末尾 \nstrlen 返回异常大的值数组未初始化没有结束符使用前把数组置0scanf(%s) 读不了带空格的字符串%s 遇到空格停止换用 fgets 或 gets_s这些坑虽然小但是第二次学的时候还会再犯。不要紧犯一次记一次。等到你看到“字符串逆序c语言pta”能秒出代码数组和字符串这关就基本过了。4. 指针与内存管理C语言的灵魂也是劝退之王4.1 指针的本质存着地址的变量很多第一次学指针的人被“*p、a、指针数组、数组指针”绕晕。我觉得最好的类比是快递柜一个变量是一个柜子变量名是柜子编号变量值是柜子里放的东西。普通变量是“直接看柜子里放什么”指针变量是“这个柜子里放的是另一个柜子的编号”。定义一个指针 intp; 中的只是说明“p是一个指针指向int”。拿变量的地址用ap a; 读地址里的内容用*p写入内容也用p 新值。所以“c语言中的a什么意思”这个问题取决于上下文如果a是指针*a就是解引用访问它指向的位置如果a是普通变量*a是非法语法。另一个必须记住的是指针的步长。int *加1地址增加sizeof(int)个字节char *加1地址增加1个字节。这一点在数组遍历里特别重要也解释了为什么void *不能直接做算术运算。知道了步长你就能理解 pointer index 其实就是 array[index] 的另一种写法。指针名字虽然吓人骨子里全是地址运算。4.2 指针与数组、函数参数的三联招指针和数组的纠缠最常见的三个场景数组名传参void func(int arr[], int n) 和 void func(int *arr, int n) 完全等价编译器眼里都是指针。指针偏移遍历for (int *p arr; p arr n; p) 等价于 for (int i 0; i n; i)。前者可读性差一点但能深刻理解数组就是连续内存。通过指针修改调用者的变量swap(a, b) 才是真正的交换。第三个场景是新手最容易忽略的。如果你写 void swap(int a, int b)函数内部交换了形参实参根本不会变。只有用指针把实参地址传进去函数内 *pa 新值 才会修改原来的变量。这就是C语言里“模拟引用传递”的手段。学指针最好的练习题就是写一个完整版swap然后分别用传值和传地址各跑一遍看看main里的变量到底变没变。4.3 malloc/free 和内存泄漏学到就是血泪动态内存管理是第二次学C必须补的一课。第一次学的时候我几乎完全没碰malloc/free的例题只会在真正需要链表时才临时抱佛脚。第二次我老老实实把内存分配五件套练了一遍malloc、calloc、realloc、free、以及函数返回堆内存的写法。malloc分配指定字节数的连续内存返回void *。因为不知道你想当什么用所以必须强转int *p (int *)malloc(n * sizeof(int)); 之后必须判断返回值是否为NULL因为内存不够时malloc返回NULL。free(p)释放后一定要把p置为NULL防止野指针。为什么因为free只回收内存不会把p里的地址清掉你如果再 *p 1就是操作一块已经归还的内存行为未定义。小程序可能没事大程序可能直接引发段错误或数据错乱。内存泄漏指的是你每次调用都malloc却不free导致程序运行时间越长占用内存越多。排查手段通常是检查代码里所有malloc分支是否都有对应的free路径。这个习惯比任何工具都重要。在嵌入式环境内存更小泄漏后果更严重malloc/free的使用必须非常克制甚至很多单片机项目干脆用静态数组和内存池。4.4 结构体、链表指针的高阶用法到了链表C语言就开始真正“立体”了。链表节点本质是结构体其中有一个指针成员指向下一个节点。定义一个最简单节点struct Node { int data; struct Node *next; };创建新节点需要malloc分配内存然后给data赋值next置为NULL。遍历链表就是从头指针出发不停 p p-next。插入、删除节点的关键也是操作指针指向而不是移动数据。链表这部分建议手写一个“带头节点的单链表”实现创建、头插、尾插、删除、遍历。我第二次学的时候是边看网课边写第一次写完没跑通原因很典型忘记给新节点next置NULL导致遍历时读出乱码还有一处删节点后没有free出现内存泄漏。这些错误在纸上画图是看不出来的必须跑起来看现象。热词中有“单片机c语言没有堆栈吗为什么”这样一个问题我在这里多说几句。很多人看到裸机程序似乎没有进程/线程的概念就觉得C只有全局变量没有栈。实际上只要是可重入的C函数调用过程中就必须保存返回地址、寄存器、局部变量这就是栈的职责。单片机比如基于8051内核的C编译器通常会用片内RAM的一段区域做硬件堆栈但栈空间很有限递归太深容易溢出。而一些资源更紧张的MCU编译器可能用软件模拟栈存放地址在别的内存区域。所以准确的说法是单片机C语言当然有栈只是它的栈和PC上那个“用户栈”规模完全不同。这个点如果没有理解好后面写嵌入式程序时容易用错递归和局部大数组。4.5 虚拟存储器管理用C语言怎么做热词里还有“虚拟存储器管理c语言”。严格说这是操作系统课程里用C语言模拟“页面置换算法”之类的实验而不是C语言本身的功能。用C写虚拟存储模拟通常是数组保存页表项、用链表或队列实现FIFO/LRU页面淘汰。它能够很好地把指针、数组、链表、结构体组合一次。如果你在学完链表之后想做点综合性项目用C写一个简单的FIFO和LRU页面置换模拟器是不错的选择。这个实践比堆概念更管用因为它逼着你对“内存中的结构体数组”做大量指针操作。5. 实操环境与文件操作把C代码真正跑起来5.1 在VSCode里配置C语言环境5分钟跑通第二次学C时我用VSCode作为主力编辑器。配置其实不复杂但第一次配置时被“launch.json 和 tasks.json”搞到怀疑人生。我给一个最简可行的路径安装Visual Studio Code和C/C扩展微软官方那个。安装MinGW-w64Windows下或直接在Linux/macOS下用系统自带gcc/clang。新开终端输入 gcc --version确认编译器可用。新建test.c写好代码后用终端手动编译运行gcc test.c -o test ./test。这一步最简单不需要任何JSON配置。想用VSCode的调试按钮才需要生成tasks.json和launch.json。在命令面板输入 C/C: Build and Debug Active FileVSCode会自动生成默认配置一般把program路径改成 ${fileDirname}/${fileBasenameNoExtension}.exeWindows即可。这里有一个很多人问的“vscode配置c语言环境”的坑VSCode里的终端可能是PowerShell运行./test会报“无法加载”需要改成.\test.exe或者使用CtrlF5运行而不调试。如果你想要更省事直接用Code Runner插件快捷键CtrlAltN一键运行但调试要切换回官方插件。至于“隐藏光标”这种细节如果你说的是编辑器里闪动的光标样式可以在设置里搜“cursor”调闪烁方式如果你说的是运行控制台里隐藏光标那属于控制台APIWindows下用GetStdHandle和SetConsoleCursorInfo可以实现。这个需求通常是做打字游戏或动态界面时才用学习阶段没必要纠结。5.2 文件读写fopen、fscanf、fprintf的一个完整例子文件操作在第二次学C时是绕不开的热词里fgets、fscanf和fprintf都出现得很多。我写一个学生成绩写入和读出的例子#include stdio.h typedef struct { char name[32]; int score; } Student; int main() { Student stu[3] {{Alice, 90}, {Bob, 85}, {Cindy, 92}}; FILE *fp fopen(score.txt, w); if (fp NULL) { perror(fopen); return 1; } for (int i 0; i 3; i) { fprintf(fp, %s %d\n, stu[i].name, stu[i].score); } fclose(fp); FILE *rf fopen(score.txt, r); if (rf NULL) { perror(fopen); return 1; } char name[32]; int score; while (fscanf(rf, %s %d, name, score) 2) { printf(%s - %d\n, name, score); } fclose(rf); return 0; }fopen的第二个参数w会清空原文件再写r要求文件必须存在a是追加。fscanf的返回值是成功读取的变量个数所以循环条件用2能安全判断是否读到一组完整数据。文件读取结束时fscanf返回EOF循环自动退出。这里要提醒fscanf %s 读取字符串时遇到空白字符会停顿所以名字里别带空格。如果要读带空格的行使用fgets再sscanf解析。文件操作还有个容易忽略的点fclose之前写缓冲区可能没有真正写到磁盘。程序正常return或调用fclose时会冲刷缓冲但进程异常退出时可能丢数据。因此在敏感场景下要重视fflush。不过学习阶段只要养成“开一次文件用完立刻fclose”的习惯就够了。5.3 调试技巧从printf到断点第一次学C时我遇到bug只会加printf第二次则开始用VSCode的调试器。调试的价值在于你能看到每一行执行后变量的变化。设置断点、点击运行调试、查看变量面板、逐步执行这套流程能省下大量“猜bug改代码重跑”的时间。有一个很重要的调试技巧对“数组越界、野指针”这类问题用调试器看地址和值最直观。比如一个字符串乱码你可以在debug控制台里输入str和str对比内存。另一个技巧是监视malloc的返回值如果你把返回值强转成某个结构体指针后直接访问成员崩了大概率是malloc失败或给n传了错误的大小。这些都是调试器能看到、printf未必能看到的信息。6. 常见问题排查与避坑备忘6.1 输入输出经典坑%d、字符、Bool和!()的问题热词里有一句“c语言变量用%d输入一个字符后的值”这是我第一遍学的时候踩过的坑。如果你用 int a; char c; 把c的地址交给%d也就是 scanf(%d, c);——严格说这是类型错配编译器会警告但运行时行为还是要分平台看。更常见的坑是用 printf(%d, c) 打印一个char变量比如 char c0; 正常应该打印48因为0的ASCII码是48。你得到48并不是bug而是把字符当整数看了。如果输入的是字符A用%c读和用%d读得到的结果完全不同。我建议在练习本上把ASCII码表常用几项背下来048A65a97换行10空格32。写字符串处理时特别有用。“!()c语言是啥”这个搜索词应该是在看代码时遇到了类似 if(!(x 0)) 这种写法。!是逻辑非运算符!()是“对括号里的逻辑值取反”。x0为真!(x0)就为假等价于 x ! 0。它不是遗留的奇怪符号只是把“非”写在括号外面。把!和!区分清楚一个是“取反”一个是“不等于”。C99之后使用stdbool.h才有bool、true、false。严格说C语言原先没有bool类型很多人写代码就自己define true/false或者直接用int。如果看到“bool _bool”这样的搜索词可能是在看国产教材的老版本或某个特殊头文件。正常新代码包含#include stdbool.h即可。这个知识点不需要背只要知道“bool本质是_Bool的别名_Bool是C99标准加的整数类型”就够了。6.2 关于“C语言必背100代码”和学习题库网上流传的“C语言必背100代码”我认真看过几遍。它其实就是把排序、查找、字符串、链表、文件读写这些高频代码整理成清单比如九九乘法表、冒泡排序、二分查找、链表逆置、文件复制。它有价值但绝不能拿来死记。我的建议是给这些代码分类一类是“语法模板”比如hello world、输入输出、if-else、for/while、switch分支一类是“经典算法”比如冒泡、选择、插入、二分查找、递归斐波那契还有一类是“结构模型”比如单链表、栈/队列的数组实现、文件读写封装。背之前先理解每一行的作用然后手抄一遍运行一遍最后不看答案重新写一遍。能够默写“必背代码”只能说明你记住了语法能够把它改造成解决新问题才算真正学会。题库方面翁恺老师的练习题、PTA平台题目都适合用来练手。第二次学习时我给自己定的量是每天至少两道小题和一道综合题。综合题最好是那种“数组函数字符串指针”都要用上的比如学生成绩管理系统、图书信息管理、单词统计也可以做一个C语言打字游戏。这类项目才是检验4到6章是否学透的最好试金石。6.3 第二次学C我给自己的五个铁律第二次学习C语言和第一次最大的区别在于第一次求“过”第二次求“用”。我给自己定了五个任性的规矩分享出来也许有用第一绝不复制粘贴网上代码每个例子都要自己敲一遍。第二凡是“理解不了”的题先画内存图画完再写。数组、指针尤其如此。第三写完代码必须跑起来看结果别在脑内编译。所谓“我以为能跑”都是幻觉。第四遇到报错优先读最后一行但不是只看最后一行把第一个报错解决了后面的可能自动消失。第五学完一个节点自己做一个小改造并记录到笔记里。比如冒泡排序改成降序、fopen的w改成a测试追加、输出加个“第几次循环”辅助观察。最后再分享一个我这次重学的小技巧把教材上每一章课后题的题目用自己的语言翻译一遍再给代码写注释。当你发现自己能给别人讲清楚“数组名传参为什么是传指针”的时候这一章就真的拿下了。第二次学C语言不需要什么惊天动地的天赋只需要每天敲一段代码并把每一个“哦原来如此”的时刻积累下来。这些积累会在某一天突然连成片然后你会发现以前那些背不下来的东西已经不用背了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

谷歌图片搜索 API:字段口径、外链防盗链与成本纪律 2026/9/26 14:59:01

谷歌图片搜索 API:字段口径、外链防盗链与成本纪律

图片端点是六个端点里最贵的:每次成功请求 2 credits,是搜索端点的两倍;它的返回结构也最容易踩坑——你以为有 title,它经常没有;你以为数组一定在,它可能整个缺席。这篇把字段口径、请求路径和成本纪律一次讲清,给一个能直接跑的采集脚本。 先说两个最容易栽的点:端点路径是…

阅读更多 →
Zephyr与FreeRTOS线程优先级差异:从数值反转到调度机制全解析 2026/9/26 14:59:01

Zephyr与FreeRTOS线程优先级差异:从数值反转到调度机制全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Trash-ICRA19数据集实战:从标注到YOLOv8训练全流程 2026/9/26 14:59:01

Trash-ICRA19数据集实战:从标注到YOLOv8训练全流程

简介:这套YOLO目标检测配套数据包取自Trash-ICRA19海洋垃圾检测数据集,已经过统一整理,形成可被现有训练框架直接读取的标注格式,面向需要海洋漂浮物与水下废弃物检测样本的学生和研究人员,也适合计算机、电子信息、数…

阅读更多 →
Atlas 300V部署YOLO实战:从驱动到调优的完整指南 2026/9/26 14:58:49

Atlas 300V部署YOLO实战:从驱动到调优的完整指南

有人问“Atlas 300V 24G到底是不是一张正常的运算加速卡”,这问题我一年前也问过自己。后来在昇腾环境上把YOLOv5、YOLOv8的推理部署完整跑通,才意识到大多数人对它的误解都来自用GPU的思维惯性。这篇文章就把Atlas上部署YOLO的完整流程、参数设置、调优…

阅读更多 →
中通顶象验证码逆向全解析:从抓包到风控加固 2026/9/26 14:58:42

中通顶象验证码逆向全解析:从抓包到风控加固

这两年做Web安全与反爬对抗,我绕不开一个东西——验证码。尤其是中通快递这类体量巨大的业务系统,页面上的顶象验证码几乎成了所有自动化脚本的第一道拦路虎。很多朋友在群里问“中通顶象验证码逆向怎么搞”,我今天不打算给一个所谓的“秒过方…

阅读更多 →
Kimi 智能助手核心能力全景拆解:从配置到效果验证的 TaoToken 实践 2026/9/26 14:58:24

Kimi 智能助手核心能力全景拆解:从配置到效果验证的 TaoToken 实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉