在Rust中应该如何进行指针运算?

在Rust中应该如何进行指针运算?,rust,Rust,我知道答案是“你不应该”。。。但是为了争论,你应该怎么做呢 例如,如果您想编写一个不同于Vec的替代方案 我发现您可以通过将*mut T值转换为u64并添加到它们中,然后将它们转换回*mut并读取指针处的值来制作“编译和运行的东西”(见下面的示例)。这似乎是可行的,但也留下了一些悬而未决的问题: *mut T指针是否始终适合u64 当数据是来自libc:calloc的任意(即非托管类型)数据块时,写入不安全指针是否会触发指针别名问题 这只会起作用,因为我使用的是基元类型(f64)。如果这是一个真

我知道答案是“你不应该”。。。但是为了争论,你应该怎么做呢

例如,如果您想编写一个不同于
Vec
的替代方案

我发现您可以通过将
*mut T
值转换为
u64
并添加到它们中,然后将它们转换回
*mut
并读取指针处的值来制作“编译和运行的东西”(见下面的示例)。这似乎是可行的,但也留下了一些悬而未决的问题:

  • *mut T
    指针是否始终适合
    u64

  • 当数据是来自
    libc:calloc
    的任意(即非托管类型)数据块时,写入不安全指针是否会触发指针别名问题

  • 这只会起作用,因为我使用的是基元类型(
    f64
    )。如果这是一个真实的数据对象,我必须先
    忘记();但是,如果类型复杂且有子记录,您能简单地将()写入目标,然后愉快地读取()吗

  • 这真的是正确的方法吗?看起来非常尴尬。我希望找到一些不安全的
    ptrtoint()
    /
    inttoptr()
    对,但我找不到类似的东西

  • 例子 指针有一个用于指针运算的函数

    fn main() {
        let items = [1usize, 2, 3, 4];
    
        let ptr = &items[1] as *const usize;
    
        println!("{}", unsafe { *ptr });
        println!("{}", unsafe { *ptr.offset(-1) });
        println!("{}", unsafe { *ptr.offset(1) });
    }
    
    输出

    2
    1.
    3.
    

    您可能应该使用
    items.as_ptr()
    来获取指针,当然您的方法也可以。。。
    fn main() {
        let items = [1usize, 2, 3, 4];
    
        let ptr = &items[1] as *const usize;
    
        println!("{}", unsafe { *ptr });
        println!("{}", unsafe { *ptr.offset(-1) });
        println!("{}", unsafe { *ptr.offset(1) });
    }