🔗 Parâmetros: Passagem por Referência

Na passagem por valor, enviamos uma cópia. Na passagem por referência, enviamos o “endereço” da variável original. Isso permite que a função modifique o dado diretamente na fonte.

🔍 Comparativo Visual

Passagem por Valor (Cópia)

graph LR
    A["Variavel A (10)"] -- "Copia valor 10" --> B["Parametro B (10)"]
    B -- "Muda para 20" --> C["Parametro B (20)"]
    style A fill:#e8f5e9
    style C fill:#ffebee

Passagem por Referência (Apontamento)

graph LR
    A["Variavel A (10)"] -- "Aponta para" --- B["Parametro &B"]
    B -- "Muda para 20" --> A
    style A fill:#e1f5fe,stroke:#01579b

🏗️ Sintaxe em Portugol

Para indicar uma referência, utilizamos o símbolo ampersand (&) antes do nome do parâmetro:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
programa {
    // O '&' indica que 'saldo' é uma referência direta
    funcao aplicarJuros(real &saldo) {
        saldo = saldo * 1.10
    }

    funcao inicio() {
        real minhaConta = 1000.0
        aplicarJuros(minhaConta)
        escreva("Saldo atualizado: ", minhaConta) // Exibirá 1100.0
    }
}

💡 Quando usar cada uma?

SituaçãoTécnica RecomendadaPor quê?
SimulaçãoValor (Cópia)Você não quer alterar o dado original (ex: ver como ficaria um desconto).
Ação RealReferência (&)Você precisa atualizar o estado global (ex: confirmar uma compra, perder vida em um jogo).
Múltiplos RetornosReferência (&)Funções só podem retorne um valor. Use referências para “devolver” vários dados alterados.

🎮 Exemplo Prático: Sistema de Jogo

Imagine um jogo onde uma função coletarItem() precisa atualizar as moedas e o inventário ao mesmo tempo.

1
2
3
4
5
6
7
8
9
funcao coletarMoeda(inteiro &moedasAtuais, inteiro valor) {
    moedasAtuais = moedasAtuais + valor
}

funcao inicio() {
    inteiro carteira = 0
    coletarMoeda(carteira, 50)
    escreva("Você agora tem: ", carteira, " moedas.")
}

🏁 Resumo do Capítulo

A passagem por referência é uma ferramenta poderosa, mas deve ser usada com cuidado, pois permite que funções alterem o estado do programa principal de forma direta. Você agora domina a base da comunicação avançada entre funções! 🚀