KyrieChao

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 04095、温度 -4085)
第二梯队 快排/qsort、归并、堆排序 O(n log n) 通用乱序数据主力
第三梯队 插入、选择、冒泡 O(n²) 小数据或特定硬件

选型口诀:日常业务数据用 qsort,排 ADC 值用计数排序,做任务调度用堆排序,排几个零散变量用插入排序。 嵌入式项目建议直接用系统库 qsort,鲁棒性远高于手写。

Rust

今天没学习,休息。

思考

无。

明日计划

  1. C 语言:指针深入(指针运算、指针与数组、指针与函数)
  2. Rust:恢复学习节奏