HoRain云--Zig编程:数组与切片全解析

📅 2026/7/4 20:07:37 👁️ 阅读次数 📝 编程学习
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};

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;

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 切片对比

特性

数组[N]T

切片[]T

长度

编译期固定

运行期可变

内存

直接存储数据

只引用数据

拷贝

深拷贝

浅拷贝

是否拥有内存

常见用途

栈分配、固定数据

函数参数、动态数据


四、数组 → 切片(非常常见)

几乎所有 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];

九、什么时候用哪个?


如果你愿意,我可以继续讲:

只要告诉我你想深入哪一部分 👍

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙