Puntero
Una variable que guarda la dirección de memoria de otro dato, en lugar del dato en sí.
Toda variable vive en una posición de la memoria. Un puntero guarda esa posición: con él puedes leer o cambiar el dato original desde otra parte del programa.
Son potentes pero peligrosos: un puntero que apunta a memoria ya liberada o fuera de un array provoca fallos y vulnerabilidades. C++ moderno usa punteros inteligentes y referencias, y lenguajes como Rust comprueban su uso al compilar.
Un ejemplo
En C, int *p = &x; guarda en p la dirección de x; *p = 5; cambia el valor de x.
Por qué importa
Los punteros aparecen en cuanto trabajas con C o C++, y también en Go o en el código «unsafe» de Rust y C#. Sirven para pasar datos grandes a una función sin copiarlos, para recorrer arrays, para construir listas enlazadas o árboles y para reservar memoria durante la ejecución con malloc o new. Si no los entiendes, no sabrás por qué una función no modifica el valor que le pasas o por qué el programa se cierra de golpe.
Además, casi todos los errores graves de memoria clásicos nacen de aquí: usar un puntero sin inicializar, usarlo después de liberar la memoria o salirte del límite de un array. Entender qué guarda realmente un puntero (una dirección, no el dato) te ayuda a leer mensajes como «segmentation fault» y a depurarlos con método.
Confusiones frecuentes
Se confunde el puntero con el dato al que apunta. En int *p = &x;, p contiene una dirección y *p es el valor guardado en esa dirección. Otro error típico de principiante es declarar un puntero y desreferenciarlo sin haberle dado antes una dirección válida: apunta a un lugar indeterminado y el resultado es impredecible. También se mezcla con la referencia de C++: una referencia es otro nombre para una variable ya existente, no puede quedar vacía y no se reasigna; un puntero sí puede cambiar de destino y valer nulo.
Preguntas frecuentes
¿Qué significa «segmentation fault»?
Que tu programa intentó acceder a una zona de memoria que no le pertenece. Suele deberse a desreferenciar un puntero nulo, no inicializado o ya liberado, o a salirse de un array. Revisa qué punteros usa la línea que falla.
¿Para qué sirve el operador `&` y el `*`?
En C, &x obtiene la dirección de x y *p accede al valor al que apunta p. Con int *p = &x; y luego *p = 5; cambias x sin nombrarla.
Fuentes consultadas
- Pointer declaration (cppreference.com)