如何将Rust数组转换为指针?

3

我在谷歌上找不到一个简单的方法。如何将简单的Rust数组转换为指针?

如何获取指向[u8; 3]的指针?我尝试使用as *mut u8,但它无法工作。


3
为什么您想这样做?在Rust中,指针不像在C语言中那样有用。如果您解释一下为什么要这么做,也许有人可以给您提供更好、更符合惯用法的Rust实现方式来满足您的需求。 - Jesper
@Jesper 谢谢你对 Rust 编程安全的关注。我需要这个来与 C 交互,特别是为 Rust 开发 OpenGL 绑定。是的,我可以使用 glutin,它是安全的。实际上,我已经在使用它,但是我正在编写一个纯 OpenGL C 调用的绑定来与 glutin 进行比较,并支持外部纹理(我认为这在 glutin 中是不可能的)。 - Guerlando OCs
2个回答

11
使用 as_ptr()as_mut_ptr() 方法。
fn main() {
    let a: [u8; 3] = [1, 2, 3];
    println!("{:p}", a.as_ptr());
}

0x7ffc97350edd

数组可以转换为切片,因此可以在数组上调用任何切片方法。


6
请注意,Rust 中的数组只是一组内存块。它们不像 C 语言中的数组那样指向一些存储对象,而是它们本身就是对象的序列。
如果您有一些数据,并且想要获取指向它的指针,通常会创建引用,因为只有引用(和其他指针)可以使用 `as` 强制转换为指针。
fn main() {
    let a: [u8; 3] = [1, 2, 3]; // a blob of data on the stack...
    let a_ref = &a; // a shared reference to this data...
    let a_ptr = a_ref as *const u8; // and a pointer, created from the reference
    println!("{:p}", a_ptr);
}

游乐场


2
顺便说一下,C数组也是“对象序列”,它们会衰减成为指针,但它们本身并不是指针。如果我没记错的话,与C数组交互通常很奇怪和不一致,因为它们需要向后兼容BCPL,而在BCPL中,数组实际上是指向另一个位置的指针。如果C数组实际上是指针,那么就不存在灵活的数组成员。 - Masklinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接