C 语言是什么
如果把计算机世界想成一座城市,C 就是很多底层建筑仍在使用的「标准图纸语言」。操作系统、驱动、单片机固件里,大量核心代码仍是 C。它不花哨,但非常扎实。
1. 一句话概念
2. 为什么你会在嵌入式里天天见到它
STM32、ESP32 等芯片的官方库、寄存器说明、示例工程,主流都是 C(或兼容 C 的 C++)。学会 C 之后:
- 能看懂 HAL/标准外设库的函数原型与结构体
- 能理解地址、指针、位掩码这些「硬件味道」很重的写法
- 再学 C++ / Python 时,很多语法直觉可以直接迁移
3. C 语言的气质(先建立感觉)
| 气质 | 含义 | 对你写代码的影响 |
|---|---|---|
| 简洁 | 关键字少、语法紧凑 | 规则总量可控,适合打基础 |
| 贴近硬件 | 指针、位运算、结构体内存布局 | 能直接描述寄存器与协议 |
| 程序员主导内存 | malloc/free 或手动管理 | 要认真设计所有权与生命周期 |
| 过程式思维 | 自顶向下拆函数 | 先想清楚步骤,再写代码 |
4. 完整例子:C 在工程里长什么样(示意)
下面不是你现在就要全部看懂的代码,而是让你感受「真实 C 工程」的零件:结构体配置外设、函数初始化、主循环处理。
| 1 | #include <stdint.h> |
| 2 | |
| 3 | /* 用结构体描述一个「设备配置」 */ |
| 4 | typedef struct { |
| 5 | uint8_t pin; // 引脚号 |
| 6 | uint8_t active_low; // 低电平有效? |
| 7 | uint16_t debounce; // 消抖计数 |
| 8 | } Button_t; |
| 9 | |
| 10 | /* 函数:初始化一个按钮对象 */ |
| 11 | void Button_Init(Button_t *btn, uint8_t pin) { |
| 12 | if (btn == 0) return; |
| 13 | btn->pin = pin; |
| 14 | btn->active_low = 1; |
| 15 | btn->debounce = 0; |
| 16 | } |
| 17 | |
| 18 | int main(void) { |
| 19 | Button_t key; |
| 20 | Button_Init(&key, 13); // PA13 之类 |
| 21 | /* 这里之后通常会有 while(1) 主循环读按键 */ |
| 22 | return 0; |
| 23 | } |
5. 逐段拆解(现在看不懂很正常)
- #include
:引入 uint8_t 等定宽整数类型 - typedef struct ... Button_t:把「引脚+电平+消抖」打包成一种自定义类型
- Button_Init(Button_t *btn, ...):用指针修改外部对象(函数不能「凭空」改你的局部变量)
- btn->pin = pin:通过指针访问结构体成员
- main:程序入口;Button_t key 在栈上分配一个按钮对象
6. 常见误解先排雷
- 误解:C 很老所以没用了 → 实际底层生态极强
- 误解:必须先学 C++ 才能做嵌入式 → 很多岗位 C 更直接
- 误解:指针是玄学 → 先建立「地址+类型」模型即可入门
- 误解:一开始就要背完全部关键字 → 按需学习更高效
7. 这一板块怎么学
- 先跑通「写代码→编译→看输出」闭环(见《第一个程序》)
- 掌握类型、变量、运算符、流程控制
- 用生活例子理解函数、数组、字符串
- 攻指针与结构体:嵌入式面试与实战的核心
- 补文件、预处理器、动态内存与避坑清单