AnyCompiler

References e Pointers

Uma reference, escrita com &, é um alias para uma variável existente — uma vez vinculada, ela nunca pode ser reatribuída para se referir a outra coisa. Passar uma reference para uma function permite que essa function modifique a variável original, sem o custo de copiá-la.

#include <iostream>
using namespace std;

void addOne(int& n) {
    n = n + 1;
}

int main() {
    int x = 5;
    addOne(x);
    cout << "x = " << x << endl;
    return 0;
}
Output
x = 6

Pointers

Um pointer, escrito com *, guarda o endereço de memória de um valor em vez de fazer alias diretamente. Diferente de uma reference, um pointer pode ser reatribuído para apontar para outro lugar completamente diferente, e pode ser null (nullptr) para significar 'não aponta para nada'. & pega um endereço, * desreferencia um pointer para obter o valor para o qual ele aponta.

#include <iostream>
using namespace std;

int main() {
    int x = 10;
    int* p = &x;
    cout << "value = " << *p << endl;
    *p = 20;
    cout << "x = " << x << endl;
    return 0;
}
Output
value = 10
x = 20

Como é um erro real de const-correctness

Diferente do Rust, C++ não tem um borrow checker rastreando quem pode ler ou escrever um valor em um dado momento — mas ele impõe const-correctness: uma function que recebe uma const reference promete não modificar aquilo a que se refere, e o compilador a obriga a cumprir essa promessa. Isso é genuinamente o que o g++ relata quando essa promessa é quebrada — capturado de uma execução real, não escrito para parecer plausível:

#include <iostream>
using namespace std;

void tryToModify(const int& n) {
    n = 100;
}

int main() {
    int x = 5;
    tryToModify(x);
    cout << x << endl;
    return 0;
}
Output
main.cpp: In function ‘void tryToModify(const int&)’:
main.cpp:5:7: error: assignment of read-only reference ‘n’
    5 |     n = 100;
      |     ~~^~~~~

Nada roda — nenhum resultado, só o erro. const-correctness é uma das poucas garantias em tempo de compilação que o C++ te dá de graça; tudo mais sobre segurança de memória aqui é convenção, não imposição.

A seguir: functions e overloading — parâmetros, argumentos padrão, e polimorfismo em tempo de compilação através de function overloading.

Practice exercise

Escreva uma function doubleIt(int& n) que dobre n in place através da reference. Chame-a com x = 21, depois imprima x.