C语言入门不绕路:环境搭建、指针初体验与新手高频坑

决定学C语言那天,我在笔记本上只写了一行字:从今天开始,不绕路了。之前大半年我一直徘徊在各种语言教程里,能照着写点小工具,但只要别人追问一句"那个内存错误到底怎么回事""为什么这段代码快那段代码慢",我就彻底哑火。后来有个朋友点了一句:你不是想搞懂底层吗,那就回去老老实实学C。这大概就是这个记录的开端。这篇博文不讲高深理论,就是我从零开始学C的第一阶段全记录,包括环境怎么搭、第一个程序怎么跑通、变量和指针该怎么理解、以及那些不看文档就容易踩进去的坑。适合两类人:一类是零基础准备从C入门的,另一类是写了几年脚本想回来补地基的。C也许不是最友好的入门语言,但从它开始,你会明白很多"魔法"其实都是可解释的机制。

1. 为什么要从C开始:它不是"最难的入门",而是"最直接的入门"

1.1 学语法容易,学"计算机怎么想"很难

C这门语言的语法其实很小,常用关键字就那么几十个,不像很多现代语言动辄几百个内置概念。真正的难点从来不在语法,而在于你怎么让思维贴近计算机的运行方式:变量存在哪、数组在内存里是什么形状、函数调用时现场是怎么保存的。这些东西在别的语言里基本被藏起来了,C一个都不藏,所以它反而成了理解计算机的一条捷径。用打比方来说,开自动挡的车可以完全不懂发动机,但你想彻底搞懂发动机原理,就得拆开看活塞和曲轴。C就是这个机械结构。

1.2 C教给你的三件事,换个语言也通用

第一是内存观。所有数据最终都躺在内存里,指针就是内存的门牌号。第二是数据表示,char、int、float在内存里是不同规格的抽屉,占多大、能存多大范围,都跟字节数直接相关。第三是控制权,C没有自动垃圾回收,也没有运行时替你检查错误,错了就错给你看,逼着你搞清楚每一步发生了什么。这三件事一旦在C里理解透,再回头看解释型语言或带垃圾回收的语言,很多"魔法"都会变成可预见的机制。我在学到指针之后,再回头理解其他语言里的引用、拷贝、闭包,明显顺畅很多。这也是我坚持从C开始的最大动力。

1.3 C现在还在干什么

很多人问"学C是不是过时了",实际上C照样活跃在操作系统、嵌入式设备、数据库引擎、网络协议栈这些场景里。那些场景的共同点是:离硬件近、对性能敏感、资源有限,需要程序员精确控制内存和行为。换句话说,凡是"不容出错、讲究效率"的底层系统,C依然是主力。所以学C不只是为了应付课程,更是给以后的系统编程、数据结构、嵌入式方向打底子。退一步说,就算你最终写应用层,理解C也会让你调试其他语言的问题时更有方向感。

1.4 哪些人适合现在开始

如果你是刚接触编程,C作为第一门语言是很稳的路线;如果你已经会写一点代码,但老觉得自己在"照葫芦画瓢",也完全可以回来补一遍C。C不是一门"学完就丢掉"的语言,它是地基中的地基。第一周确实容易劝退,调试报错也容易让人灰心,但只要你的目标是"搞懂原理"而不是"快速出效果",C反而是效率最高的起点之一。我的建议是:别把它当任务,把它当成你探索计算机内部的一次长期旅行,心态稳了,进度反而快。

2. 环境搭建实录:从零到第一条可执行程序

2.1 选编译器:免费、标准、命令行可用

C语言本身是标准文本,不是某家公司独占的,所以编译器选择非常多。我的选择标准就三条:免费、贴近通用标准、能在命令行里用。开源编译器基本都满足。安装方式主要看你的操作系统。Windows平台需要下载安装包,装完可能还要配置一下环境变量,让系统能找到编译命令;Linux和苹果系统通常一条安装命令就能完成,或者系统自带。装完之后,打开终端敲一条查看版本信息的命令,能正常输出版本号,就说明编译器已经就位。整个过程十分钟以内,别在这里卡太久,卡住了就去求助搜索引擎,把报错原文贴上去比什么都有用。

2.2 编辑器与IDE:新手怎么选不后悔

我的建议是前期用"文本编辑器+终端"的组合。这个方案的好处有三:第一,它逼着你搞清楚从源文件到可执行程序之间的每一步;第二,以后学调试器、学版本管理都要和终端打交道,提前适应不亏;第三,这也是很多从业者的日常模式,你和他们的习惯贴近,搜问题、问别人的时候沟通成本最低。如果你实在不习惯纯命令行,用集成开发环境(IDE)也完全可以,按钮一点就能编译运行,适合把注意力先放在语言本身。但要留意,IDE的工程配置有时会把编译细节藏起来,报错时反而不好定位。我现在的折中方案是:日常练习用轻量编辑器,需要断点调试的时候再用IDE。

2.3 验证环境:编写第一份源代码文件

新建一个目录专门放练习代码,文件名用英文小写加.c后缀,比如hello.c。写代码之前先明确一点:你敲进去的是"源代码",计算机不认这个,必须经过编译器加工才能运行。先写一个最简单的程序:

#include <stdio.h> int main(void) { printf("hello, c\n"); return 0; }

保存后在终端进入该目录,执行编译命令,形如:

cc hello.c -o hello

再执行运行命令:

./hello

看到屏幕输出hello, c,就说明你的整套工具链是通的。这一步的意义不在于"我写出了第一个程序",而在于你把"源代码→编译→可执行文件→运行"这条链路完整走了一遍。以后遇到任何想不通的问题,都可以回到这条链路上找答案。

3. 拆解第一个程序:源代码到可执行文件之间发生了什么

3.1 一条编译命令背后的四道工序

很多人以为敲完编译命令就直接生成了能运行的程序,其实中间隔着四道工序。第一道是预处理,处理所有以#开头的指令,比如#include把你的头文件内容"粘贴"进来,宏定义在这里展开;第二道是编译,把C代码翻译成汇编语言;第三道是汇编,把汇编翻译成机器指令,生成目标文件;第四道是链接,把目标文件和你用到的库函数合并,最终生成完整的可执行程序。把这四道工序拆开理解,最大的好处是排错时能分阶段。比如以后看到undefined reference这类错误,就知道问题出在链接阶段,通常是某个函数只声明了没实现,或者漏了库。

3.2 逐行读hello.c:没有一行是顺手写的

  • #include <stdio.h>:stdio.h是标准输入输出头文件的声明集合,printf的声明就在里面。现在不用关心全部内容,但要记住原则:用哪个标准函数,就得包含对应的头文件。
  • int main(void):这是程序的入口,操作系统运行你的程序时从这里开始执行。C标准规定main的返回类型必须是int,void表示不接受命令行参数。网上有些老教材写void main,不属于标准写法,一开始就按规范来,免得后面养成坏习惯。
  • printf("hello, c\n");:把格式化的字符串输出到屏幕,\n是换行符。注意源文件里写的是反斜杠加n两个字符,输出结果才是换行。如果忘了写\n,程序运行完会紧接着输出系统提示符,看起来就像"没换行"。
  • return 0;:把0作为退出状态返回给操作系统,约定俗成0代表正常结束,非0代表异常。以后写脚本判断程序是否成功,判断的就是这个返回值。

3.3 改完代码必须重新编译:新手最容易忽略的一步

这里必须单独提醒:你在编辑器里改了源代码,直接去运行,电脑执行的还是旧的可执行文件。因为任何一个改动都要重新经过编译,才能变成新的可执行文件。我刚开始学的时候就犯过这个毛病,改了几次没反应,还以为是代码写得不对,后来才发现是根本没重新编译。这个"修改→重新编译→运行→看结果"的循环,就是你以后每天要重复几百遍的基本节奏。节奏对了,效率不会低。

3.4 面对编译报错的心态

第一次编译就报错,太正常了。我的第一条错误是少写一个分号,编译器给我报了一长串英文,当时差点以为代码全错了。后来才知道,编译器报告的错误行号有时和真实位置有偏差,比如漏了大括号,它会把错误定位到文件末尾。正确做法是:从第一条报错开始处理,解决完再重新编译,别一口气想改完所有错误,因为后面的报错经常是前面错误的连锁反应。这个"一条一条来"的习惯,能替你省下大量时间。

4. 变量、类型与输入输出:最基础也最容易"看会了但写不对"

4.1 先把"字节"这个单位刻进脑子里

C语言里每个变量都要声明类型,类型决定了它占多少字节、能存什么范围的数据。初学先记住下面这几个:

类型常见占用典型范围(以32位对齐为例)格式化占位符
char1字节-128 ~ 127%c
int4字节约 -21亿 ~ 21亿%d
float4字节约 7位有效数字%f
double8字节约 15位有效数字%lf
long long8字节范围非常大%lld

特别提醒两件事。第一,char虽然叫字符,本质是整数,它存的是字符编码,大多数情况就是ASCII码,所以char既能当字符用,也能当小整数用。第二,不同平台下int的字节数不保证一样,老平台上int可能是2字节,跨平台代码要留意类型长度。理解字节数之后,很多问题就通了:整数溢出就是抽屉太大塞不下,数据从边缘溢出,结果完全不可预期。

4.2 printf和scanf:一对"格式化的双胞胎"

输出用printf,输入用scanf,它们的第一个参数都是格式字符串,后面的参数按占位符依次对应。新手最容易踩的坑有两个。第一个是占位符和变量类型不匹配,比如用%d打印long long,用%f打印int,结果完全不可信;第二个是scanf里漏写&,代码长这样:

int age; scanf("%d", &age); // 正确:传的是age的地址 scanf("%d", age); // 错误:把age的值当成地址用

为什么scanf非要地址?因为它要把读到的值写进这个变量里,而C函数默认是值传递,scanf拿不到变量本身,只能拿到地址再找到它。这个"地址"的概念你现在先有个印象,学到指针会彻底明白。还有一个常见现象:连续用scanf读数字再读字符,缓冲区里可能残留换行符,导致读字符时直接读到换行而不是你输入的字符。真遇到这种"为什么跳过输入"的问题,优先怀疑缓冲区。

4.3 用sizeof验证"我以为的"类型大小

与其背文档,不如自己动手验证。C提供一个运算符叫sizeof,可以测出类型或变量占多少字节:

printf("%zu\n", sizeof(int)); printf("%zu\n", sizeof(char));

在多数平台的普通机器上,你能看到4和1。用这种方式确认类型大小,比自己死记硬背靠谱,而且等以后学到结构体时,sizeof会经常出现在内存计算的场景里。顺带一提,printf里打印sizeof要用%zu,别用%d,这也是个容易踩的小坑。

4.4 运算符里的三个隐形陷阱

  • 整数除法:5 / 2结果是2,不是2.5。两个整数相除,商是整数,小数部分直接丢弃。想要浮点结果,得让至少一边是浮点数,写成5.0 / 2。
  • 自增自减的位置:i++和++i,前者先取当前值再自增,后者先自增再取新值。单独写成一行没区别,混进表达式里就很容易算错,建议新手把它单独放一行,别图省事。
  • 短路逻辑:A && B中如果A为假,B根本不会执行;A || B中如果A为真,B也不会执行。利用这个特性可以写简洁的判断,但也容易在"以为B会执行"的时候踩坑。

5. 控制流与函数:把代码从一条直线变成一张网

5.1 三种循环,各自适合什么

for循环适合"步数明确"的场景,比如从0遍历到9:

for (int i = 0; i < 10; i++) { printf("%d\n", i); }

while循环适合"条件为先"的场景,比如不知道循环几次,只知道满足条件就继续;do-while保证循环体至少执行一次,适合"先做一次,再根据结果决定要不要继续"的场景。初学阶段容易忽略的细节有两个:for括号里三个部分用小写分号分隔,千万别写成逗号;while循环里更新条件的语句别漏,否则就是死循环。我自己就写过一次死循环,终端刷屏根本停不下来,最后只能强行结束进程。那次之后我才真正记住,循环里必须有能让条件变成假的操作。

5.2 if和switch:分支判断的两个派系

if-else if-else是最常用的分支结构,新手容易把else if误写成else后面直接跟条件。switch适合对单个整数值做多分支判断,看起来比一长串if更清爽,但C的switch有一个历史遗留坑:每个case分支结束一定要写break,否则会"穿透"到下一个case。这种错误编译器不报、运行时不崩,只是逻辑上多执行了不该执行的分支,排查起来特别头疼,因为它表现成"结果不对"而不是"程序坏了"。另外,判断相等用==,赋值用=,这两个符号写混了编译器有时候只给警告不报错。一定要把编译警告当回事,警告不是烦你的,是救你的。

5.3 函数的本质:参数是"复制"给你的,改不动外面

函数让代码复用,但新手最容易误解的是参数传递方式。C默认是值传递,意思是调用函数时,实参的值被复制了一份给形参,函数内部怎么修改形参,都不影响外面的变量。所以想写一个交换两个变量的swap函数,如果参数直接传int,代码编译运行全正常,可交换的只是两份拷贝,外面的变量纹丝不动:

void swap_bad(int a, int b) // 外面的变量不会变 { int tmp = a; a = b; b = tmp; }

要让函数真正修改外面的变量,只能传地址,也就是指针。这个知识点我是学到指针之后回头看函数才彻底想通的:值传递解决"只读",指针参数解决"要改"。函数还有个作用域问题:定义在函数里的局部变量只在函数内有效,函数返回后它就被回收了,所以千万别返回局部变量的地址。这个在指针章节还要重点展开。

5.4 break和continue:循环里的两个控制杆

在循环体里,break用于立即跳出整个循环,continue用于跳过本次循环的剩余部分、直接进入下一轮。这两个关键字本身不难,但新手容易用成"万能逃生门",遇到复杂循环就乱放。我的建议是:能用循环条件本身表达的就别用break,break一多,代码逻辑就很难跟踪。continue则要小心别造成死循环,比如先continue后写循环变量的更新语句,那更新就永远不会执行。

6. 指针初体验:难了三天,通了之后就再也回不去了

6.1 把变量想象成带门牌号的房间

内存就是一排排有地址的房间,每个变量占据其中一间或几间。你声明int a = 10,编译器会在内存里给a分配一个地址;&a是房间的门牌号,*是按门牌号进去拿里面的内容。举个例子:

int a = 10; int *p = &a; // p保存a的地址 printf("%d\n", *p); // 输出10

新手对星号的两个角色容易犯晕:声明里的星号是"声明一个人是指针",表达式里的星号是"访问这个地址指向的值"。我这里有个记忆方法:声明时跟在类型后面,表示"这是存放地址的变量";使用时放在指针变量前面,表示"取出该地址上的内容"。指针必须先指向一个合法的地址再用,否则就是野指针,解引用野指针常常直接崩溃,是C语言里最出名的定时炸弹之一。记住一句话:不指向合法地址的指针,就当它不存在,碰都别碰。

6.2 数组名就是首元素的地址

数组和指针的关系,是我学C时最大的顿悟点。声明int arr[5],arr本身就是数组首元素的地址,arr[i]其实是*(arr + i)的语法糖:

int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; // 数组名已经是地址,不需要加& printf("%d\n", *(p + 2)); // 输出3,也就是arr[2]

这里要特别注意一个细节:p + 1移动的距离不是1个字节,而是1个int的大小,也就是通常的4个字节。指针加1,是按照它指向的类型的大小来移动的。这个规则决定了指针运算的结果,也是新手容易懵的地方。想明白数组名就是地址之后,字符串就很好理解了:字符串本质上就是字符数组,以'\0'结尾。"abc"在内存里其实是'a'、'b'、'c'、'\0'四个字节。所以给字符串分配数组时,大小永远要记得多留一个位置放结尾符。char s[3]去存"abc",表面看三个字符刚好放下,实际越界了一个字节,而越界往往不会立刻报错。

6.3 指针最常见的三个翻车现场

  • 野指针:声明了指针变量但没赋值就解引用,指针的值是随机的,访问随机地址,结果不可预期。
  • 悬垂指针:指向了一个已经失效的局部变量。函数返回后局部变量被回收,指向它的指针就成了悬垂指针,再访问就是踩内存。
  • 空指针解引用:指针是NULL还去解引用,大多数平台会直接报段错误。

排查这类问题,不要盯着代码念咒语,要加打印语句看地址和值的变化,或者用调试器在崩溃位置看函数调用栈。我第一次遇到段错误,整整花了一个晚上才定位到是一个未初始化的指针。等指针通了之后,你会觉得之前学的变量、数组、函数全部串起来了,因为它们本质上都在讲内存地址怎么用。指针这一关必须自己写代码去撞,只看书不练,三个月也通不了。

7. 新手高发坑清单:这些错我都替你踩过了

7.1 scanf漏写&:数据源错了一切都白搭

这个前面提过,但值得单独说一次。给基本类型变量读值,scanf从第二个参数开始,必须传地址。漏掉&,程序不一定立刻崩溃,但读进来的值不可信,后面的所有逻辑都在错误数据上运行。遇到"数据很奇怪"的问题,第一步就去检查scanf调用,把漏掉的&补上。

7.2 数组越界:不报错,但会悄悄改别人的内存

C不检查数组下标是否越界。对长度为5的数组做arr[10]操作,编译器不管、运行时不报错,但你的程序可能已经写坏了旁边变量的内存。这类bug的特点就是随机:有时正常,有时崩溃,换个编译器优化选项表现还不一样。应对的办法是自己在写代码时维护好边界,循环条件的临界值,比如0和n-1,要反复验证;越是"偶尔出错"的问题,越要先怀疑越界。

7.3 浮点数不能直接比大小

0.1 + 0.2在C里不等于0.3,这不是C的问题,而是浮点数用二进制表示有限小数时天然存在误差。所以比较浮点数应该判断它们的差是否足够小:

#include <math.h> if (fabs(a - b) < 1e-6) { // 认为相等 }

这个经验在后面的数值计算里频繁用到,早记住早轻松。

7.4 字符串数组大小永远要加1

存"abc"至少要4个字节,因为结尾有一个'\0'。这不是文档里的边角料,而是很多字符串功能的基础:字符串长度、拷贝、拼接,全部依赖'\0'来定位结尾。数组开小了,字符串函数会把'\0'写到数组外的内存,越界问题又来了。所以每次声明字符数组,我都会先数一下字符个数,再默默加1。

7.5 一张表收拢高频小坑

现象常见原因检查思路
程序崩溃在scanf附近漏了&或格式串写错从上到下重读scanf调用
循环次数不对边界条件写错,比如<=和<混用用纸笔跑一遍0和n两个边界值
整数运算结果"变负"int溢出换long long或改算法
条件判断总是不成立==写成了=开启编译警告并认真看警告
do-while编译不过do-while结尾漏了分号检查循环末尾有没有分号
修改代码没反应忘记重新编译确认是否重新编译过

这些小坑每一个单独看都不难,但它们有一个共同点:不会连环报错,只会让程序"静悄悄地错"。这也是C语言最有性格的地方——它把内存的控制权全部交给你,同时也把出错的成本交给你。养成小步快跑的习惯能挡掉大多数问题:每写一个功能就编译一次、运行一次,别一口气写几百行再开炮。我刚学的时候吃过这个亏,写完一百行以为没问题,一编译二十个错误,根本不知道从哪改起。现在的规矩是,任何新代码先保证能编译运行,再加下一个功能。

最后讲点心里话。学C的开始阶段,最难熬的不是语法,而是那种"总觉得自己没学会"的焦虑。我第一周每天都在怀疑自己是不是太笨。后来总结出一个土办法:每天只定一个小目标,今天搞懂变量和打印,明天搞懂循环,后天搞懂函数;每学一个知识点,就在编辑器里从零写一遍,不看教程、不复制粘贴。这个办法笨,但特别管用,因为C的很多概念光看不会,必须亲手敲一遍才知道自己卡在哪。

如果你也正准备开始学C,我只劝你一句:不用急着囤一堆书,能把一本标准的入门教材从头到尾认真读下来、把里面的习题全部自己写一遍,就已经超过大多数人了。后面遇到不明白的,再回过来翻翻我的这些记录,你会发现上面说的每个坑,你迟早都会撞上一次。撞就撞吧,撞完,你就真学会了。

相关新闻

Transformer长上下文之困:SSM与混合架构如何破局?

Transformer长上下文之困:SSM与混合架构如何破局?

1. 为什么Transformer的“上下文墙”不只是算力问题&#xff0c;而是记忆结构问题我一开始接触长文本任务的时候&#xff0c;也以为只要把显卡堆上去、把序列长度拉到128K、甚至1M&#xff0c;Transformer就能从容应对。直到有一次跑一个金融公告的风险因子抽取任务&#xff0c…

2026/10/20 9:46:04 阅读更多 →
AI课程矩阵实战路线:从提示词工程到API调用与批量部署

AI课程矩阵实战路线:从提示词工程到API调用与批量部署

AI 课程现在不难找&#xff0c;难的是判断一门课在你的成长路径里到底处于哪个位置。市面上大量课程要么只教提示词&#xff0c;要么直接堆 ComfyUI 节点&#xff0c;学完能复现案例&#xff0c;但换个场景就不会用了。“河南元力共生 AI 课程矩阵”这个提法&#xff0c;核心是…

2026/10/20 9:45:00 阅读更多 →
秋招十月下旬还没回音:剩下六周怎么排

秋招十月下旬还没回音:剩下六周怎么排

版权与内容来源声明 本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容&#xff0c;均在附表 A 中标注来源&#xff1b;引用官方原文保持原样&#xff0c;不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准&#xff0c;标注「待验证」的部…

2026/10/20 9:45:00 阅读更多 →

最新新闻

文件夹.EXE病毒专杀工具:Windows资源管理器劫持急救方案

文件夹.EXE病毒专杀工具:Windows资源管理器劫持急救方案

简介&#xff1a;这是一款专为清除“文件夹.EXE”类伪装型病毒设计的轻量级杀毒工具&#xff0c;面向普通电脑用户及初级系统维护人员&#xff0c;解决因误点伪装文件夹导致的恶意代码执行、文件隐藏、系统异常等典型感染问题。压缩包共4个文件&#xff08;443KB&#xff09;&a…

2026/10/20 10:23:05 阅读更多 →
300W人脸关键点数据集整理包:开箱即用的COCO-Keypoints工程资产

300W人脸关键点数据集整理包:开箱即用的COCO-Keypoints工程资产

简介&#xff1a;本资源是面向计算机视觉研究者与深度学习工程师的300W人脸关键点数据集整理包&#xff0c;专为面部对齐、关键点检测及人脸几何建模等任务提供高质量训练基础。资源包含2个核心NumPy数据文件&#xff08;facial_image.npy与facial_keypoints.npy&#xff09;&a…

2026/10/20 10:23:05 阅读更多 →
微博热搜爬虫实战:requests直取JSON+Excel结构化落盘

微博热搜爬虫实战:requests直取JSON+Excel结构化落盘

简介&#xff1a;本资源是一份面向Python初学者与数据采集实践者的轻量级微博热搜爬虫实战项目&#xff0c;聚焦社交媒体热门话题的自动化抓取与结构化存储。项目使用requestsBeautifulSoup实现网页请求与HTML解析&#xff0c;提取微博TOP50热搜标题及链接&#xff0c;并通过pa…

2026/10/20 10:23:05 阅读更多 →
高并发发卡系统设计:券码生成、库存扣减与核销闭环

高并发发卡系统设计:券码生成、库存扣减与核销闭环

简介&#xff1a;这是一套面向电商运营者与PHP开发者的一站式发卡平台源码&#xff0c;聚焦团购营销与虚拟商品二级交易场景&#xff0c;解决传统发卡系统缺乏用户自流转、活动运营弱、资金监管缺位等痛点。资源共2000个文件&#xff0c;主体为507个PHP后端逻辑文件、304个HTML…

2026/10/20 10:23:05 阅读更多 →
WinForm自绘登录窗体实战:无边框圆角UI与自绘控件实现解析

WinForm自绘登录窗体实战:无边框圆角UI与自绘控件实现解析

简介&#xff1a;C#登录窗体完整示例包&#xff0c;面向WinForms桌面应用初学者及中级开发者&#xff0c;可用于课程设计、项目原型或界面参考&#xff0c;集中演示了如何构建外观出众且具备完整交互逻辑的登录模块。压缩包为RAR格式&#xff0c;共70个文件&#xff0c;大小约5…

2026/10/20 10:23:05 阅读更多 →
ROS2+Autoware实车部署:跨越仿真与物理世界的三堵墙

ROS2+Autoware实车部署:跨越仿真与物理世界的三堵墙

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

2026/10/20 10:22:04 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →