如何访问Rust中存储值的内存地址?我的代码为何未显示地址?
Rust引用打印内存地址的问题解答
你遇到的情况是因为Rust的Display和Debug trait对引用类型做了自动解引用处理,并非你对引用/解引用的逻辑理解有误。
现有代码的行为解释
你的代码:
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); }
输出全为2的原因:
{}格式说明符调用Displaytrait,{:?}调用Debugtrait。Rust为所有实现了Display/Debug的类型的引用,自动实现了对应的trait,处理时会自动解引用引用,直接输出指向的值。所以&x和y(均为&i32类型)用这两个格式符打印时,都会输出x的值2。*y是显式解引用,得到x的值,打印2符合预期。
如何打印内存地址
要打印变量的内存地址,需要使用专门的{:p}格式说明符,它专门用于输出指针或引用的内存地址:
fn main() { let x = 2; let y = &x; println!("Value of x: {}", x); println!("Address of x: {:p}", &x); // 打印x的内存地址 println!("Address stored in y: {:p}", y); // 打印y指向的地址(即x的地址) println!("Value of y (dereferenced): {}", *y); }
示例输出:
Value of x: 2 Address of x: 0x7ffdxxxxxxxxx Address stored in y: 0x7ffdxxxxxxxxx Value of y (dereferenced): 2
(注:实际地址会因运行环境不同而变化)
总结
- 你对解引用的理解是正确的,
*y确实会获取引用指向的值。 println!的格式符{}和{:?}对引用会自动解引用,这是Rust的语法糖特性,方便直接输出引用指向的内容。- 打印内存地址必须使用
{:p}格式说明符。
内容的提问来源于stack exchange,提问作者user1245262
相关产品推荐
相关产品推荐

