2026-08-14 周五 · 字符数组进阶与指针入门
2026-08-14
技术
C 语言
学习内容:C 语言 Day15 笔记——字符数组进阶 + 指针入门
中文字符的编码表示
char 只有 1 字节,只能表示 ASCII;中文需要多字节编码。
| 编码方案 | 归属 | 中文占用 |
|---|---|---|
| GB2312 / GBK / GB18030 | 中国国标 | 2 字节(GB18030 可 4 字节) |
| Unicode / UTF-8 / UTF-16 | 国际标准 | UTF-8 中文一般 3 字节 |
- 中文版 Windows 默认 GBK,Linux/macOS 默认 UTF-8
- 乱码根本原因:编码和解码用的字符集不一致
- 换行符差异:Linux/macOS 用
\n(LF),Windows 用\r\n(CRLF)
三维数组与二维字符数组
- 三维数组:二维数组构成的数组,形象理解为"一栋楼"(若干层,每层是行列房间)。
double nums1[3][4][5] - 通用规律:给了初值后,只能省略第一维的长度,其余维必须写,编译器自动推导第一维
- 二维字符数组 = 字符串数组:
char all_names[50][31],all_names[i]是第 i 个字符串;重新赋值要用strcpy不能用=
数组与函数(再强调)
C 语言不希望数组作返回值/形参,原因是内存拷贝开销。数组作形参时编译器退化为指针:void f(short data[100]) / void f(short data[]) / void f(short* data) 三种写法完全等价,sizeof(data) 在 64 位下恒为 8。
指针入门
指针是一种数据类型,用来表示内存地址,本质是无符号整数(32 位 4 字节、64 位 8 字节)。操作系统把内存按字节编号,编号即地址,CPU 通过地址读写数据。
| 运算符 | 名称 | 作用 |
|---|---|---|
& |
取地址运算符 | 单目,得到操作数的内存地址 |
* |
解引用运算符 | 单目,操作数是地址,得到该地址处的数据 |
两个运算符都是单目,与二目的按位与
&、乘法*区分开。指针占位符是%p。
几个关键点:
- 地址用首字节地址表示:数据类型决定宽度,首字节地址 + 宽度即可唯一确定数据
- 大小端存储:小端(Little Endian)低位字节存低地址,大端相反;X86/ARM 等主流平台都是小端
- 定义指针:
基类型* 变量名;,基类型 = 指针所指向的数据类型;*p1 = 5与j = 5等价(通过指针/变量名访问内存) - NULL 指针:值为 0,可赋给任意指针,表示"不指向任何有效内存";暂不确定指向时先初始化为
NULL是好习惯
附录:排序算法选型速查表
承接 Day14 排序预览,嵌入式场景选型三梯队:
| 梯队 | 算法 | 复杂度 | 定位 |
|---|---|---|---|
| 第一梯队 | 计数排序 | O(n) | 数据范围极狭小时无敌(如 ADC 0 |
| 第二梯队 | 快排/qsort、归并、堆排序 | O(n log n) | 通用乱序数据主力 |
| 第三梯队 | 插入、选择、冒泡 | O(n²) | 小数据或特定硬件 |
选型口诀:日常业务数据用
qsort,排 ADC 值用计数排序,做任务调度用堆排序,排几个零散变量用插入排序。 嵌入式项目建议直接用系统库qsort,鲁棒性远高于手写。
Rust
今天没学习,休息。
思考
无。
明日计划
- C 语言:指针深入(指针运算、指针与数组、指针与函数)
- Rust:恢复学习节奏