Ziglings 笔记 04: 数组的基础操作


数组:有序的集合

在掌握了基础变量后,Ziglings 的第四个练习带我们进入了数据结构的领域:数组(Arrays)

在 Zig 中,数组是固定长度的,并且存储着相同类型的数据。它看起来和 C 语言很像,但其实更聪明、更安全。

挑战:修正与读取

我们需要修复一个关于质数列表的程序。任务包括:

  1. 修正声明以便修改数组内容。
  2. 读取特定的元素。
  3. 获取数组的长度。

解决方案

这是完成后的代码:

const std = @import("std");

pub fn main() void {
    // 1. 必须使用 'var',因为后面我们要修改它
    // [_] 让编译器自动计算数组长度(这里是8)
    var some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 };

    // 修改第一个元素(索引 0)
    some_primes[0] = 2;

    const first = some_primes[0];

    // 2. 获取第4个元素(索引 3)
    const fourth = some_primes[3];

    // 3. 获取数组长度
    const length = some_primes.len;

    std.debug.print("First: {}, Fourth: {}, Length: {}\n", .{
        first, fourth, length,
    });
}

核心知识点总结

1. 自动长度推导 [_]

Zig 允许懒人写法。如果你在声明时直接初始化了数组,就不需要手动数元素的个数。

  • [5]u8{...}:显式指定长度。
  • [_]u8{...}:让编译器自己数。

2. 内存安全:边界检查

虽然在这个练习中没有体现,但 Zig 的数组非常注重安全。 在 C 语言中,访问 some_primes[100] 可能会读取到内存里的垃圾数据甚至导致漏洞。 但在 Zig 中,越界访问会导致程序直接 Panic(崩溃)并报错。这种“快速失败”的机制能帮助我们在开发阶段就发现严重的 Bug。

3. .len 属性

每个数组都有 len 字段。对于定长数组,这个值是固定的,编译器在编译时就知道它的大小。


后续预告:数组是基础,但如果我们想要一个长度可变的视图该怎么办?下一篇我们将接触 Zig 中最强大的特性之一:切片(Slices)。