Avatar ·

O que significam os símbolos de ampersand (&) e asterisco (*) em Rust?

Olá a todos! Acabei de começar a aprender Rust e não consigo entender dois operadores: & (ampersand) e * (asterisco). Em outras linguagens, como C++, estou acostumado que & é para obter o endereço e * é para desreferenciar um ponteiro. Mas em Rust é tudo um pouco diferente.

Por exemplo, escrevi um programa simples que tenta alterar o valor de uma variável através de uma função:

fn main() {
    let x = 42;
    let y = &x;
    println!("{}", y); // Funciona, mas o que está acontecendo aqui?
    
    let mut z = 10;
    change_value(&z);
    println!("{}", z);
}

fn change_value(val: &i32) {
    *val = 100; // Erro! Por quê?
}

O compilador reclama da linha *val = 100, diz algo sobre val ser uma referência imutável. Mas estou usando o asterisco para desreferenciar! Por que isso não funciona?

Também não entendo por que às vezes é necessário escrever & antes de uma variável ao passar