Logo

Rust中的数组

Rust 数组知识点总结


一、数组与动态数组(Vector)的区别

  1. 数组(Array)
    长度固定,声明后不可改变
    存储在栈上,性能高
    • 类型表示为 [T; N](如 [i32; 5]

  2. 动态数组(Vector)
    长度可变,可动态增减元素
    存储在堆上,性能有额外开销
    • 类型为 Vec<T>


二、数组的定义与核心特性

  1. 三要素
    • 长度固定
    • 元素类型相同
    • 线性连续排列

  2. 示例

    let a = [1, 2, 3, 4, 5]; // 自动推导类型
    let months: [&str; 12] = ["January", "February", ..., "December"];
    

三、数组的声明与初始化

  1. 显式类型声明

    let a: [i32; 5] = [1, 2, 3, 4, 5];
    
  2. 重复值初始化

    let a = [3; 5]; // 等价于 [3, 3, 3, 3, 3]
    

四、数组元素的访问与越界检查

  1. 通过索引访问

    let first = a[0]; // 获取第一个元素
    let second = a[1]; // 获取第二个元素
    
  2. 越界检查
    • 在运行时检查索引是否合法
    • 越界会导致 panic(如访问 a[5] 时)
    • 示例:用户输入索引时需处理潜在越界问题


五、数组切片(Slice)

  1. 定义与使用
    • 切片是对数组的 部分连续引用
    • 类型为 &[T],具有固定大小(引用类型)

    let a: [i32; 5] = [1, 2, 3, 4, 5];
    let slice: &[i32] = &a[1..3]; // 包含元素 2, 3
    
  2. 特点
    • 长度灵活,取决于起始和结束位置
    • 创建代价低(仅引用原始数据)


六、多维数组与遍历

  1. 多维数组声明

    let arrays: [[u8; 3]; 4] = [one, two, blank1, blank2];
    
  2. 遍历与操作

    for a in &arrays {
        for n in a.iter() {
            print!("{} ", n);
        }
    }
    

七、注意事项与常见问题

  1. 类型混淆问题
    • 数组类型 [T; N] 和切片类型 [T] 不同
    • 切片引用 &[T] 是固定大小的类型

  2. 长度是类型的一部分
    [u8; 3][u8; 4] 是不同类型

  3. 实际使用建议
    • 优先使用切片引用 &[T](如函数参数)
    • 不确定长度时选择 Vector


八、综合示例

fn main() {
    let one = [1, 2, 3];           // 自动推导类型
    let two: [u8; 3] = [1, 2, 3];  // 显式类型
    let blank = [0; 3];            // 重复初始化
    let arrays = [one, two, blank];// 二维数组

    for a in &arrays {
        for n in a.iter() {
            print!("{} ", n);
        }
    }
}

关键总结

• 数组适合固定长度的场景(如月份、固定配置),性能优先时使用。
• 动态数组 Vector 更灵活,适用于需要增删元素的场景。
• 切片 &[T] 是操作数组数据的常用方式,兼顾安全性与灵活性。
• 注意类型系统和越界检查,避免运行时错误。

© 2025 All rights reservedBuilt with Flowershow Cloud

Built with LogoFlowershow Cloud