给出这段代码:
let mut a = 5;
let b = &mut a;
*b = 6;
println!("{:p}",&a as *const i32 );
println!("{:p}",a as *const i32 );
println!("{:p}",&a );
println!("{:p}",&mut a );
和输出:
0x5b97aff97c
0x6
0x5b97aff97c
0x5b97aff97c
输出第二行'a'的地址代表什么? 记忆里有吗?它没有改变,而其他一切都在改变。为什么?
简化您的代码以隔离您所询问的行,我们有以下内容:
let mut a = 5;
let b = &mut a;
*b = 6;
println!("{:p}",a as *const i32 );
由于
b
被分配为对 a
的可变引用,因此 *b = 6
行正在将 a
中存储的值修改为 6
。
将整数转换为指针,如
a as *const i32
中所做的那样,将该整数值(在本例中为 6
)视为指针的地址。因此,a as *const i32
正在创建一个指向存储在0x6
的数据的指针。
当您打印指针时,正如示例中其他行所做的那样,它会打印指针的地址。因此,
println!("{:p}",a as *const i32 );
打印地址0x6
,因为a
的值用作强制转换创建的指针的地址。