我在Rust操场上try 了以下代码,认为其中一个选项要么会显示存储x的内存位置,要么至少会抛出一个错误:

fn main() {
    let x = 2;
    let y = &x;

    println!("Value of x: {}", x);
    println!("Value of x: {:?}", &x);
    println!("Value of y: {:?}", y);
    println!("Value of y: {}", *y);
}

相反,我得到了以下输出:

Value of x: 2
Value of x: 2
Value of y: 2
Value of y: 2

我是不是完全误解了Rust引用内存位置的方式?&或者,有什么有趣的东西关于打印!我缺少的宏?或者,只是我不明白它允许在内存位置上进行操作的方式?

推荐答案

:p是打印指针地址的说明符:

fn main() {
    let x = 2;
    let y = &x;

    println!("Value of x: {}", x);
    println!("Address of x: {:p}", &x);
    println!("Address of y: {:p}", y);
    println!("Value of y: {}", *y);
}

Playground.

或者,将引用转换为原始指针,在调试时显示它们的地址:

fn main() {
    let x = 2;
    let y = &x;

    println!("Value of x: {}", x);
    println!("Address of x: {:?}", &x as *const _);
    println!("Address of y: {:?}", y as *const _);
    println!("Value of y: {}", *y);
}

Rust相关问答推荐

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

"value is never read警告似乎不正确.我应该忽略它吗?

新创建的变量的绑定生存期

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

使用关联类型重写时特征的实现冲突

.在 Rust 模块标识符中

详尽的匹配模式绑定

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

如何从borrow 的异步代码运行阻塞代码?

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

如何将参数传递给Rust 的线程?

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

如何异步记忆选项中的 struct 字段

在单独的线程上运行 actix web 服务器

为实现特征的所有类型实现显示

如何为枚举中的单个或多个值返回迭代器