常量指针与对齐
表达只读访问并控制内存布局。
常量指针与对齐 是 CoddyKit 上的免费 Zig Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Zig Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Zig Academy 课程共包含 4 节课。
只读访问
您经常会希望共享一个值,同时承诺不修改它。const 指针允许读取,但禁止写入。
*const T 类型
将指向不可变数据的指针写作 *const T。您可以通过它读取数据,但为其目标赋值会导致编译错误。
const x: i32 = 5;
const p: *const i32 = &x;Const 随 & 传递
获取常量值的地址会自动得到 *const T,因此不可变性会由类型保留。
const v: u8 = 9;
const p = &v; // *const u8可变指针可强制转换为 Const
*T 可以自由强制转换为 *const T,因为移除写入权限始终是安全的。反向转换则不允许。
var n: i32 = 1;
const ro: *const i32 = &n;为什么优先使用 const
接受 *const T 参数可以向调用者表明您只会读取数据,这会让函数更值得信赖。
fn show(p: *const i32) void {
// read only
}对齐是什么意思
每种类型都有自己的对齐方式:也就是它必须落在的地址边界上。u32 通常需要位于可被四整除的地址上。
使用 @alignOf 查询
内置函数 @alignOf(T) 会以字节为单位返回类型所需的对齐方式,就像 @sizeOf 返回其大小一样。
const a = @alignOf(u32);类型中的对齐方式
您可以使用 align 在指针类型中写出对齐要求,例如 *align(4) u8,以要求特定的边界。
var p: *align(4) u8 = undefined;为什么对齐方式很重要
硬件读取对齐的数据更快,而某些 CPU 在访问未对齐数据时会触发故障。Zig 会在类型中跟踪对齐方式,以确保访问正确。
过度对齐与对齐不足
指针可以承诺比默认值更严格的对齐方式,但如果没有使用 @alignCast 之类的显式转换,就不能降低这一要求。
Const 与 align 的结合
两者可以自然结合:*const align(8) T 是一个只读指针,同时保证位于八字节边界上。
快速检查
您要编写一个只需读取指针所指值的函数。哪种参数类型最能表达这一点?
回顾
*const T 指针以只读方式共享数据,并可从 *T 强制转换而来;而通过 @alignOf 和 align(n) 查看对齐方式,可以让内存访问正确且快速。🎯
常见问题解答
「常量指针与对齐」课时是免费的吗?
是的 — 「常量指针与对齐」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Zig Academy 课程的其余内容,请升级到 CoddyKit PRO。 Zig Academy 课程共包含 4 节课。
「常量指针与对齐」这节课中我会学到什么?
表达只读访问并控制内存布局。 你通过在浏览器中直接运行的动手代码来练习 Zig Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Zig Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Zig Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「常量指针与对齐」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Zig Academy 课中编写并运行代码吗?
能。每节 Zig Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。