HoRain云--Zig编程:数组与切片全解析
🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
一、数组(Array)
1. 定义
2. 特性
3. 常用操作
二、切片(Slice)
1. 定义
2. 切片的结构
3. 创建切片
4. 可变切片
三、数组 vs 切片对比
四、数组 → 切片(非常常见)
五、切片 → 数组指针
六、字符串与切片
七、常见陷阱
1. 悬垂切片
2. 数组不能直接赋值给切片变量
八、多维数组与切片
九、什么时候用哪个?
在 Zig 中,数组(Array)和切片(Slice)是处理连续数据的两种核心类型,它们在内存、生命周期和使用方式上有明显区别。下面系统介绍。
一、数组(Array)
1. 定义
数组是长度固定、编译期已知的连续内存块。
const arr: [5]u8 = .{1, 2, 3, 4, 5};类型:
[N]TN是数组长度,属于类型的一部分存储在栈上(通常)
不能动态扩容
2. 特性
✅ 长度不可变
✅ 值语义(赋值会拷贝整个数组)
✅ 编译期安全(越界访问会被捕获)
3. 常用操作
const std = @import("std"); var a = [_]u32{10, 20, 30}; // 自动推断长度 _ = a.len; // 3 _ = a[0]; // 10 for (a) |v| { std.debug.print("{}\n", .{v}); }二、切片(Slice)
1. 定义
切片是对一段连续内存的视图,由指针 + 长度组成。
const slice: []u8 = &arr;类型:
[]T不拥有内存
可以动态指向不同内存区域
2. 切片的结构
本质上等价于:
struct { ptr: [*]T, len: usize, }3. 创建切片
const arr = [_]u8{1, 2, 3, 4}; const s1 = arr[0..]; // 全部 const s2 = arr[1..3]; // [2, 3]4. 可变切片
var buffer: [4]u8 = undefined; var slice = buffer[0..]; slice[0] = 42;三、数组 vs 切片对比
特性 | 数组 | 切片 |
|---|---|---|
长度 | 编译期固定 | 运行期可变 |
内存 | 直接存储数据 | 只引用数据 |
拷贝 | 深拷贝 | 浅拷贝 |
是否拥有内存 | ✅ | ❌ |
常见用途 | 栈分配、固定数据 | 函数参数、动态数据 |
四、数组 → 切片(非常常见)
几乎所有 API 都接受切片:
fn sum(s: []const u32) u32 { var total: u32 = 0; for (s) |v| total += v; return total; } const arr = [_]u32{1, 2, 3}; _ = sum(&arr); // ✅ 数组转切片五、切片 → 数组指针
有时需要固定长度:
const arr_ptr: *[4]u8 = &buffer;⚠️ 必须长度匹配,否则编译错误。
六、字符串与切片
Zig 的字符串字面量是:
"hello" // 类型是 *const [5:0]u8转为切片:
const s: []const u8 = "hello";七、常见陷阱
1. 悬垂切片
fn bad() []u8 { var x: [4]u8 = undefined; return x[0..]; // ❌ 返回局部变量引用 }✅ 正确做法:由调用者提供内存,或使用堆分配。
2. 数组不能直接赋值给切片变量
var slice: []u8 = undefined; slice = buffer; // ✅ 正确八、多维数组与切片
const matrix: [3][3]f32 = .{ .{1, 0, 0}, .{0, 1, 0}, .{0, 0, 1}, }; const row: []const f32 = &matrix[0];九、什么时候用哪个?
✅数组:
长度固定
栈分配
性能敏感代码
✅切片:
函数参数
动态数据
流式处理
如果你愿意,我可以继续讲:
🦉 切片与
ArrayList🧠 数组/切片的内存布局
⚙️ 切片与 C 交互
🧪 实战示例(解析二进制、字符串处理)
只要告诉我你想深入哪一部分 👍
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
