Ziglings 笔记 04: 数组的基础操作
数组:有序的集合
在掌握了基础变量后,Ziglings 的第四个练习带我们进入了数据结构的领域:数组(Arrays)。
在 Zig 中,数组是固定长度的,并且存储着相同类型的数据。它看起来和 C 语言很像,但其实更聪明、更安全。
挑战:修正与读取
我们需要修复一个关于质数列表的程序。任务包括:
- 修正声明以便修改数组内容。
- 读取特定的元素。
- 获取数组的长度。
解决方案
这是完成后的代码:
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)。