C语言:从入门到精通
文章平均质量分 82
这是一个通俗易懂,循序渐进的 C 语言博客系列,从最基础的环境搭建一路到高阶的系统编程技巧,帮你构建一个完整的知识体系。每篇文章都配有可运行的完整代码和课后练习。你可以一边读一边写,一边改。示例代码:https://gitcode.com/gugucoding/cblog-example-codes
gugucoding
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
40. 【C语言】终点亦是起点:C 语言的现代进化与后续学习路线
本文系统回顾了学习C语言的完整知识体系与技术路线。首先绘制了C语言能力全景图,从基础语法、函数模块、指针内存、数据结构到系统编程,展示了学习者通过40篇文章的成长轨迹。接着梳理了C语言从C99到C23的现代演进,对比了C与C++的本质区别,并针对不同发展方向(嵌入式、内核开发、高性能服务等)提供了专业建议。最后强调持续成长的三大习惯:阅读优质代码、动手实践和保持技术好奇心,鼓励读者以C语言为基石深入计算机系统底层。全文既是对初学者的知识总结,也为进阶者指明了专业发展方向。原创 2026-07-09 12:36:48 · 791 阅读 · 0 评论 -
39. 【C语言】经典 C 项目实战:迷你 HTTP 服务器
我们从变量、指针、数据结构一路学到系统调用、多线程、信号处理。现在我们终于有底气将它们全部串联起来,写一个真正能用的东西:一个迷你 HTTP 服务器。这个服务器程序会监听本地端口,接受浏览器请求,解析 GET 请求,从磁盘读取对应的文件(HTML、图片、CSS 等),并返回 HTTP 响应。我们还会加入多线程并发处理和信号优雅退出,让它像一个真正的服务器一样工作。本文将带你从零开始,一步步构建它。原创 2026-07-09 12:33:35 · 489 阅读 · 0 评论 -
38. 【C语言】时间、信号与程序控制
C 语言中的时间处理、信号处理和非局部跳转。它们是程序控制领域的“软技能”——不直接产出算法结果,却决定了程序的鲁棒性和用户体验。原创 2026-07-08 10:22:28 · 455 阅读 · 0 评论 -
37. 【C语言】并发世界的钥匙:线程编程初步
要让程序“一心多用”,就需要并发编程。在 C 语言中,最常用的并发工具是 POSIX 线程(pthread)。今天我们就来打开这扇门,学会创建线程、让它们协同工作,以及解决多线程编程中最经典的坑——资源竞争。原创 2026-07-08 10:20:55 · 500 阅读 · 0 评论 -
36. 【C语言】程序的动态加载:静态库与动态库的制作与使用
成熟的软件工程会把常用的代码打包成库(Library)。库就是预先编译好的目标代码集合,你的程序可以直接链接它,不用每次都重新编译那些源文件。C 语言的库分为两种:静态库(.a / .lib)和动态库(.so / .dylib / .dll)。今天我们就来学会怎么制作它们、使用它们,以及动态库独有的运行时加载技术。原创 2026-07-07 09:13:55 · 755 阅读 · 0 评论 -
35. 【C语言】与操作系统对话:系统调用与文件底层 I/O
今天学习系统调用(System Call) 与 文件底层 I/O。这是 C 程序员从“应用层”迈向“系统层”的关键一步。理解它们,你才能真正搞懂 I/O 的性能差异从何而来,也能开始写更贴近硬件的程序。原创 2026-07-07 09:12:12 · 550 阅读 · 0 评论 -
34. 【C语言】性能优化意识启蒙
C 语言常被选来做系统编程、游戏引擎、嵌入式开发,一个核心理由就是它快。但快不是免费的:同样的逻辑,不同写法速度可能差出十倍、百倍。今天这篇文章不是教你去啃复杂的算法分析,而是建立性能优化的意识:知道程序为什么慢,编译器能帮你做什么,以及你自己在写代码时应该留意哪些坑。原创 2026-07-07 09:09:18 · 489 阅读 · 0 评论 -
33. 【C语言】调试技巧与工具
本文系统介绍了C语言调试的核心方法与工具。重点讲解了两种关键调试技术:断言(assert)用于防御式编程,及早暴露程序假设错误;GDB调试器允许设置断点、检查变量和跟踪调用栈,是定位段错误等运行时问题的利器。文章还介绍了Valgrind内存检测工具,可发现内存泄漏和非法访问。原创 2026-07-06 16:55:24 · 472 阅读 · 0 评论 -
32. 【C语言】二叉树与递归的配合
本文介绍了二叉树的基础概念和应用。主要内容包括: 二叉树的定义、 二叉树的实现、三种递归遍历方式以及二叉搜索树(BST)。原创 2026-07-06 11:19:34 · 329 阅读 · 0 评论 -
31. 【C语言】堆栈与队列的实现
本文介绍了两种经典抽象数据结构:栈(Stack)和队列(Queue)的实现与应用。栈遵循LIFO(后进先出)原则,核心操作包括压栈(push)、出栈(pop)和查看栈顶(peek),可通过数组(容量固定)或链表(动态内存)实现。队列遵循FIFO(先进先出)原则,核心操作为入队(enqueue)和出队(dequeue)。原创 2026-07-06 11:09:38 · 453 阅读 · 0 评论 -
30. 【C语言】链表进阶:双向链表与循环链表
本文介绍了双向链表和循环链表的基本概念与实现。双向链表通过在每个节点添加前驱指针(prev)和后继指针(next)实现双向遍历,解决了单向链表只能单向访问的痛点。原创 2026-07-06 10:21:07 · 399 阅读 · 0 评论 -
29. 【C语言】动态数据结构:单向链表
本文详细介绍了单向链表的基本概念与操作。链表通过指针将离散的节点串联,解决了数组插入删除效率低的问题。是后续学习双向链表、树等结构的基础。原创 2026-07-06 10:19:55 · 440 阅读 · 0 评论 -
28. 【C语言】通用数据操作:`void *` 与类型无关编程
C语言通过void*指针和函数指针实现泛型编程,克服类型限制。void*可指向任意类型数据,但需配合类型转换和内存操作函数(如memcpy)使用。示例展示了通用swap函数和仿qsort的泛型冒泡排序,通过分离数据与操作逻辑(如自定义比较函数),实现对int、double及结构体的排序。这种模式(void*+函数指针)是C语言实现“一次编写,多处使用”的核心方法,广泛应用于标准库(如qsort、内存管理函数等)。原创 2026-07-05 07:38:24 · 605 阅读 · 0 评论 -
27. 【C语言】编写可移植的头文件与模块
C 语言常被用于嵌入式、操作系统、跨平台库等领域,硬件和操作系统的差异是家常便饭。如果不加设计,代码很快就会变成到处是 `#ifdef` 的“意大利面条”。今天我们就来学习如何用预处理器,配合良好的模块化设计,写出干净、可移植的 C 代码。原创 2026-07-05 07:35:28 · 565 阅读 · 0 评论 -
26. 【C语言】编译前的“文本大师”:预处理器指令
本文介绍了C语言预处理器的核心功能和工作原理。预处理器在编译前对源代码进行文本处理,主要包括宏替换、条件编译、文件包含等操作。文章详细讲解了#define宏的定义与使用(包括对象式宏和函数式宏)、条件编译指令(#ifdef、#if等)、特殊操作符(#和##)以及预定义宏(如__FILE__、__LINE__)。通过实例说明了宏与函数的区别、条件编译的常见应用场景,以及预处理在调试和跨平台开发中的重要作用。原创 2026-07-04 11:11:36 · 462 阅读 · 0 评论 -
25. 【C语言】二进制文件与随机读写
本文介绍C语言中二进制文件操作的核心方法,重点讲解fread/fwrite实现高效数据存储,结构体与二进制的完美配合,以及随机访问技术。通过对比文本与二进制文件的特性(存储效率、精度、可读性等),说明二进制文件在游戏存档、数据库等场景的优势。最后以学生管理系统为例,演示如何用二进制存储+随机读写实现数据的增删改查。关键点包括:二进制模式必须加"b"标志、结构体整体读写注意事项、文件位置指针的精确定位技巧。(149字)原创 2026-07-04 11:08:41 · 409 阅读 · 0 评论 -
24. 【C语言】把数据存下来:文件操作基础
游戏要保存存档,编辑器要读写文档,数据库要把数据永久保存到磁盘。这就需要一个程序与外部存储世界沟通的桥梁——文件操作。C 语言通过标准库提供了一套简洁的文件操作函数,核心思路是:把文件看作一个字节流,打开它、读/写它、关闭它。今天我们就来掌握这套“磁盘功夫”。原创 2026-07-03 10:48:46 · 511 阅读 · 0 评论 -
23. 【C语言】共用体与枚举类型:当数据需要“变脸”
共用体(union)和枚举(enum)是C语言中两种特殊的复合数据类型。共用体允许不同成员共享同一块内存空间,同一时间只能存储一个成员的值,常用于节省内存、类型转换或数据拆解(如检测大小端、解析网络数据)。枚举则为一组相关整数常量提供命名,增强代码可读性,比宏定义更安全且支持类型检查。原创 2026-07-03 10:46:26 · 496 阅读 · 0 评论 -
22. 【C语言】更深入的 struct:内存对齐与柔性数组
如果你用 sizeof 量一下结构体的大小,结果往往比所有成员大小之和要大。比如:为什么 1+4+1=6,实际却是 12?这不是 bug,而是编译器为了效率而采用的内存对齐。今天我们就来彻底搞懂结构体在内存中的真实布局,并认识一个特殊的结构体成员:柔性数组。原创 2026-07-02 12:40:39 · 653 阅读 · 0 评论 -
21. 【C语言】打包不同类型:结构体
C语言结构体(struct)是一种复合数据类型,允许将不同类型的数据组合成一个整体。文章详细介绍了结构体的定义方式、变量声明与初始化方法(包含C99指定初始化器),以及成员访问的点运算符(.)和指针访问的箭头运算符(->)。重点讲解了结构体数组的用法、结构体作为函数参数的传递方式(推荐指针传递),并列举了常见的编程错误如缺失分号、错误比较操作等。结构体能有效管理复杂数据(如学生信息),是构建链表、树等数据结构的基础。原创 2026-07-02 12:29:51 · 654 阅读 · 0 评论 -
20. 【C语言】多级指针与复杂声明
为什么要用二级指针?三级指针、多级指针又是什么鬼?还有那些像咒语一样的复杂声明,到底该怎么读?今天我们就来把这些“高阶指针”彻底拿下。原创 2026-07-01 10:20:52 · 520 阅读 · 0 评论 -
19. 【C语言】动态内存分配
动态内存分配:它强大,但也危险,申请了要记得还,还了就别再用。今天我们就来掌握这套“手动内存管理”的艺术。原创 2026-07-01 10:17:29 · 484 阅读 · 0 评论 -
18. 【C语言】函数与指针的强强联合
如何把函数当作参数传给另一个函数(这正是回调的底层原理),如何用函数指针实现策略模式,以及那个让人头疼的“信号函数”声明到底怎么读。理解函数指针,你就推开了通往高阶 C 编程的一扇大门。原创 2026-06-30 11:29:36 · 375 阅读 · 0 评论 -
17. 【C语言】字符串的本质:字符指针与字符串处理
字符串在内存里怎么存、char[] 和 char* 的真正区别、怎么安全地读写字符串,以及标准库提供的那些字符串处理函数。学完这篇,你就再也不会被 strcpy 和 strcmp 搞迷糊,也能写出不怕缓冲区溢出的健壮代码。原创 2026-06-30 11:26:13 · 12785 阅读 · 0 评论 -
16. 【C语言】指针与数组的亲密关系
指针数组、数组指针、二级指针,他们到底是是什么?有什么关系?今天我们就来彻底理清这些关系。顺便,你会真正理解 C 语言字符串的本质,以及 main 函数那两个神秘参数 argc 和 argv 到底是怎么回事。原创 2026-06-29 13:18:07 · 574 阅读 · 0 评论 -
15. 【C语言】C语言的灵魂:指针初体验
为什么 scanf 要用 & 取地址?为什么说 C 语言“贴近硬件”?答案就在指针。指针是 C 语言最强大、也最让初学者头疼的特性。但不要怕,你已经有变量、内存、作用域的扎实基础,理解指针就只剩一层窗户纸。今天,我们就来捅破它。原创 2026-06-29 13:13:32 · 809 阅读 · 0 评论 -
14. 【C语言】程序的分割术:多文件编译与头文件
前面我们写的所有代码都在一个 .c 文件里。这就像把整个家的东西全堆在一个房间。真实世界的 C 项目,小则几十个文件,大则成千上万个文件。怎么把代码拆开,怎么让各个文件之间能“互相认识”,怎么避免混乱——这就是今天要解决的问题。学完这一篇,你就能把自己的程序从“单间公寓”搬进“多层楼房”。原创 2026-06-28 10:06:49 · 521 阅读 · 0 评论 -
13. 【C语言】变量的生存空间:作用域与生命周期
函数里定义的变量,出了函数就“消失”了;函数参数在里面不管怎么改,都影响不到外面。这背后其实是 C 语言的两条看不见的规则在起作用:作用域和生命周期。这篇文章,我们就来揭开这些谜底,把变量的“生存空间”搞清楚。这也是学习指针之前必须打好的一层地基。原创 2026-06-28 10:02:52 · 498 阅读 · 0 评论 -
12. 【C语言】让代码可以复用:函数的定义与调用
函数让你把一段代码封装起来,起个名字,以后用到的时候直接叫它就行。函数是模块化编程的基石,也是你从“写玩具代码”走向“写正式项目”的分水岭。原创 2026-06-27 10:09:18 · 642 阅读 · 0 评论 -
11. 【C语言】表格与矩阵:多维数组
上一篇文章我们学会了一维数组。它像一排连续的抽屉,整齐地排成一条直线。但现实中的数据往往比“一排”更复杂:课程表有行有列,棋盘有纵横坐标,图像是由像素组成的矩形网格。C 语言允许我们把这些“行”再堆叠起来,形成多维数组。今天就主要攻克二维,再浅探多维,让你以后碰到矩阵运算、图像处理、游戏棋盘之类的问题能心中有数。原创 2026-06-27 10:04:53 · 478 阅读 · 0 评论 -
10. 【C语言】把数据排成队:一维数组
数组能让你用一个名字,管理一整排数据。它是几乎所有高级数据结构(链表、栈、队列、哈希表……)的根基。今天,我们就先拿下它最基础的形式:一维数组。原创 2026-06-26 14:40:12 · 470 阅读 · 0 评论 -
9. 【C语言】重复是力量:C语言循环结构
前几篇文章,我们让程序有了记忆(变量),会说话(输入输出),还学会了判断(分支)。但程序还有一个让人类望尘莫及的本事:不知疲倦地重复做一件事。循环是计算机真正的效率利器,它能把几行代码的执行次数放大成千上万倍。C 语言给了你三把循环的工具:while、do-while、for,外加两个控制循环走向的关键字 break 和 continue。今天我们就来掌握它们。原创 2026-06-26 14:33:13 · 480 阅读 · 0 评论 -
8. 【C语言】让代码有判断力:分支结构
真实世界里,决策无处不在:如果天冷就穿厚点,否则穿薄点;红灯停,绿灯行。程序要变得“聪明”,就必须具备这种判断力。C 语言给了我们两种主要的条件判断工具:if 系列和 switch。今天我们就让程序长出“大脑”,学会在不同条件下走不同的路。原创 2026-06-25 09:31:10 · 418 阅读 · 0 评论 -
7. 【C语言】数据的操盘手:运算符大全
变量把数据存起来,输入输出让数据流起来。但程序真正干活的部分,是把存进来的数据拿去做运算——加减乘除、比较大小、判断真假、甚至摆弄二进制位。这些动作,全都靠运算符来完成。运算符就是 C 语言里的“操盘手”:它们决定数据怎么变,关系怎么判,逻辑怎么走。今天这篇文章,我们就一次把 C 语言常用的运算符认全。不用担心记不住,你可以把它当作“速查手册”,用到的时候回来看一看就行。原创 2026-06-25 09:09:06 · 521 阅读 · 0 评论 -
6. 【C语言】格式化输入输出:和程序说说话
要让程序真正和人互动,就需要能输入输出,今天我们就来攻克它们。掌握了输入输出,你的程序就不再是“静态的”,而是能对话的活物了。原创 2026-06-24 08:17:03 · 455 阅读 · 0 评论 -
5. 【C语言】数据类型全家桶
C 语言的数据类型:今天,我们就来逐一拜访 C 语言的数据类型家族,看看每个“抽屉”有多大,能装什么,该怎么选。到最后你会发现,了解类型,就是了解计算机如何存储和运算数据。原创 2026-06-24 08:11:05 · 359 阅读 · 0 评论 -
4. 【C语言】数据的模样:常量和变量
这篇文章里,你会第一次接触 C 语言的数据世界,了解如何给数据起名字、如何在内存里存放值、以及如何定义不会改变的量。这是往后所有复杂程序的地基——地基打得牢,才盖得起高楼。原创 2026-06-23 09:39:53 · 303 阅读 · 0 评论 -
3. 【C语言】解剖麻雀:C 程序的基本骨架
把 hello.c 拆开揉碎,看清楚它的骨骼和内脏。当你理解了这个最简单的程序,往后所有复杂的程序,不过是这些骨骼上长出的血肉。原创 2026-06-23 09:37:13 · 597 阅读 · 0 评论 -
2. 【C语言】工欲善其事:搭建 C 开发环境
上一篇文章我们聊了为什么要学 C 语言。今天,我们就不多废话,直接动手,把写 C 程序需要的家伙什儿准备好。目标很简单:让你的电脑上能编译并运行一个 C 程序。放心,这个过程不收费,也不需要很高的电脑配置。你只需要一台能正常开机的电脑,和一颗愿意折腾一小会儿的心。原创 2026-06-22 13:31:20 · 548 阅读 · 2 评论 -
1. 【C语言】一场通往计算机灵魂的旅程(系列开篇)
如果你想认真地学一门编程语言,并且不止步于“会用”,而是渴望理解计算机到底是怎么工作的——那么 C 语言,注定是你绕不开的一站。原创 2026-06-22 13:21:35 · 482 阅读 · 0 评论
分享