人民日报
指针保存的是地址,数组则是一段连续对象。数组名在许多表达式中会转换为指向首元素的指针,但数组和指针并不是同一种类型。理解 sizeof、指针加法、二维数组参数和 const 修饰,是避免访问错误的第一步。
函数参数中的 int a[] 通常会被视为 int *a,函数因此无法直接通过 sizeof(a) 得到原数组长度。更稳妥的接口应显式传递元素数量,例如让函数同时接收数组地址和 size_t 类型的长度。
模块化设计还应关注头文件依赖。头文件只暴露调用者真正需要的声明,内部结构可以通过不透明指针隐藏。这样既能减少重新编译范围,也能防止外部代码直接破坏模块内部状态。
理解 C17 的关键,是区分“标准规定的行为”和“某个编译器恰好允许的行为”。程序在本机能够编译,并不代表它符合标准;程序在某个版本的编译器上运行正常,也不代表换到其他平台后仍然可靠。
玩转17C需要先建立一套能够解释程序运行结果的基础知识。只会写出能够编译的代码,无法处理内存越界、生命周期错误和跨平台差异。
项目应明确选择 C17 编译模式,例如使用对应工具链支持的 -std=c17 或兼容选项,并同时配置警告级别、调试信息和优化级别。编译器命令并不只是执行工具,它也是项目规则的一部分,应通过构建脚本统一管理。