Skip to content

Rust

指针

获取数组指针

let mut arr = [1, 2, 3, 4, 5];
let p = arr.as_mut_ptr();
println!("{:?}", p)

原始指针

core::ptr::addr_of_mut!(TESTBUFF)

用指针修改元素

unsafe {
    *ptr.add(0) = 10;  // 改第1个
    *ptr.offset(1) = 20;  // 改第2个
    *ptr.add(4) = 50;  // 改第5个
}

数组

定义

let mut a = [1,2,3];

打印

println!("{:?}", a)

"{:?}":表示调试格式化输出,要求类型实现了 std::fmt::Debug。所以在调试时常用 {:?},因为它能打印几乎所有类型。

2D array

let matrix: [[i32; 3]; 2] = [
        [1, 2, 3],
        [4, 5, 6],
    ];

结构体

struct Person {
    name: String,
    age: u8,
}

实现函数

impl Person {
    // 方法(第一个参数是 &self)
    fn say_hello(&self) {
        println!("Hello, my name is {}", self.name);
    }

    // 关联函数(没有 self,像静态函数)
    fn new(name: &str, age: u8) -> Self {
        Self {
            name: String::from(name),
            age,
        }
    }
}

fn main() {
    let p = Person::new("Charlie", 30);
    p.say_hello();
}

枚举类型

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

使用

let dir = Direction::Left;
match dir {
    Direction::Up => println!("Go up!"),
    Direction::Down => println!("Go down!"),
    Direction::Left => println!("Go left!"),
    Direction::Right => println!("Go right!"),
}

内存布局

在内存布局层面,Rust 并不保证按顺序布局成员变量。因此,我们可以

  • 使用 #[repr(C)] 标记结构体;这将按 C 语言约定的顺序布局它的成员变量,让我们能正确地映射内存片段。

  • 默认情况下,Rust 枚举的表示方式是 未指定的(implementation-defined)。 编译器会根据内部优化选择合适大小(通常是 u32 或更大)如果你要和硬件寄存器、C 语言结构体、二进制协议对接, 必须显式写 #[repr(u8)]#[repr(C)]

  • 使用 repr(transparent),来确保类型和它的单个成员有相同的内存布局。

#[repr(transparent)]
struct ColorCode(u8);

比如这个内存布局就是 u8

自动生成函数

#[derive(Debug, Clone, Copy, PartialEq, Eq)]

可见性

Rust 默认的规则是:

结构体、函数、模块、字段…… 如果不写 pub,默认只能在当前模块内访问。

想在模块外访问结构体,要加 pub struct

编译器tag

允许未使用的变量

#[allow(dead_code)]