AnyCompiler

References y Pointers

Una reference, escrita con &, es un alias de una variable existente — una vez vinculada, nunca puede reasignarse para referirse a otra cosa. Pasar una reference a una función le permite a esa función modificar la variable original, sin el costo de copiarla.

#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

Un pointer, escrito con *, contiene la dirección de memoria de un valor en vez de aliasarlo directamente. A diferencia de una reference, un pointer puede reasignarse para apuntar a otro lugar completamente distinto, y puede ser null (nullptr) para indicar que 'no apunta a nada'. & toma una dirección, * desreferencia un pointer para obtener el valor al que apunta.

#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

Cómo se ve un error real de const-correctness

A diferencia de Rust, C++ no tiene un borrow checker que rastree quién puede leer o escribir un valor en un momento dado — pero sí hace cumplir la const-correctness: una función que recibe una const reference promete no modificar aquello a lo que se refiere, y el compilador la obliga a cumplir esa promesa. Esto es genuinamente lo que reporta g++ cuando esa promesa se rompe — capturado de una ejecución real, no escrito para parecer plausible:

#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 se ejecuta en absoluto — no hay resultado, solo el error. La const-correctness es una de las pocas garantías en tiempo de compilación que C++ te da gratis; todo lo demás sobre seguridad de memoria aquí es convención, no imposición.

Siguiente: funciones y overloading — parámetros, argumentos por defecto, y polimorfismo en tiempo de compilación mediante function overloading.

Practice exercise

Escribe una función doubleIt(int& n) que duplique n in place a través de la reference. Llámala con x = 21, luego imprime x.