Avatar ·

Que signifient les symboles esperluette (&) et astérisque (*) en Rust ?

Bonjour à tous ! Je viens de commencer à apprendre Rust et je n'arrive pas à comprendre deux opérateurs : & (esperluette) et * (astérisque). Dans d'autres langages, comme le C++, j'ai l'habitude que & soit la prise d'adresse et * le déréférencement de pointeur. Mais en Rust, c'est un peu différent.

Par exemple, j'ai écrit un programme simple qui essaie de modifier la valeur d'une variable via une fonction :

fn main() {
    let x = 42;
    let y = &x;
    println!("{}", y); // Ça marche, mais que se passe-t-il ici ?
    
    let mut z = 10;
    change_value(&z);
    println!("{}", z);
}

fn change_value(val: &i32) {
    *val = 100; // Erreur ! Pourquoi ?
}

Le compilateur râle sur la ligne *val = 100, disant quelque chose à propos du fait que val est une référence immuable. Mais j'utilise l'astérisque pour déréférencer ! Pourquoi cela ne fonctionne-t-il pas ?

Je ne comprends pas non plus pourquoi il faut parfois écrire & devant une variable lors de l'appel de fonction.