0Pricing
Zig Academy · 课时

常量指针与对齐

表达只读访问并控制内存布局。

常量指针与对齐 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 *T 表示单项指针
  2. 使用 ptr.* 解引用
  3. 多项指针 [*]T
  4. 常量指针与对齐
← 返回 Zig Academy