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)]