我想知道為什么list[0]并且number_list[0]有相同的地址。
據我了解,我們傳入了對 in 的參考number_list,for_question4因此 list 應該是對 的參考number_list。當我們呼叫list[0]時for_question4,它應該與 相同&number_list[0]。
但是當我列印地址時,list[0]并且number_list[0]在同一個地址上。
&list[0]并且&number_list[0]在同一個地址。
函式是否自動取消參考傳遞給它的向量?自動取消參考是 Rust 中的一件事嗎?如果是這樣,它會在什么條件下這樣做?
fn for_question4(list: &[&str]) {
println!("call index without reference {:p}", list[0]); // 0x103d23d5d
println!("call index with reference {:p}", &list[0]); // 0x7fea9c405de0
}
fn main() {
let number_list = vec!["1", "2", "3"];
let result = for_question4(&number_list);
println!("call index without reference {:p}", number_list[0]); // 0x103d23d5d
println!("call index with reference {:p}", &number_list[0]); // 0x7fea9c405de0
println!("call index with two reference {:p}", &&number_list[0]); // 0x7ffeebf46f80
}
uj5u.com熱心網友回復:
運算子在運算子之前進行[]評估。運算子自動取消參考。&[]
這里有些例子:
fn main() {
let n = vec!["1", "2", "3"];
println!(" n[0] {:p}", n[0]);
println!(" (&n)[0] {:p}", (&n)[0]);
println!(" (&&n)[0] {:p}", (&&n)[0]);
println!(" &n[0] {:p}", &n[0]);
println!(" &(n[0]) {:p}", &(n[0]));
println!(" &((&n)[0]) {:p}", &((&n)[0]));
println!("&((&&n)[0]) {:p}", &((&&n)[0]));
}
n[0] 0x5597b8ccf002
(&n)[0] 0x5597b8ccf002
(&&n)[0] 0x5597b8ccf002
&n[0] 0x5597b9f3fad0
&(n[0]) 0x5597b9f3fad0
&((&n)[0]) 0x5597b9f3fad0
&((&&n)[0]) 0x5597b9f3fad0
uj5u.com熱心網友回復:
感謝@Finomnis 才弄明白
執行自動取消參考的是索引運算子 ([])。根據參考:
對于其他型別,索引運算式 a[b] 等價于 *std::ops::Index::index(&a, b) 或 a 中的 *std::ops::IndexMut::index_mut(&mut a, b)可變的位置運算式背景關系。就像方法一樣,Rust 也會在a上重復插入取消參考操作以找到實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/474885.html
下一篇:我們可以在C中使用雙函式指標嗎?
