Punteros y direcciones en C y C++
En esta lección vas a guardar la dirección de una variable en un puntero, acceder al valor a través de ese puntero y modificar la variable original.
Introducción
Un puntero (pointer) es una variable que contiene la dirección de memoria de otra variable. El operador & da la dirección de una variable, y el operador * (desreferencia) accede al valor que hay en la dirección apuntada. Los punteros son uno de los conceptos más importantes de C y C++.
Puntos importantes
- Un puntero solo debe apuntar a un objeto que todavía existe, del tipo correcto, o valer null.
- Cada zona de memoria reservada debe liberarse exactamente una vez.
- Deja claro qué función es dueña de la memoria (ownership) y qué datos solo se leen (const).
Ejemplos de código C y C++
#include <stdio.h>
int main(void) {
int score = 70;
int *score_ptr = &score;
*score_ptr += 5;
printf("score=%d same-address=%s\n", score,
score_ptr == &score ? "yes" : "no");
return 0;
}
score=75 same-address=yes
#include <iostream>
int main() {
int score = 70;
int* score_ptr = &score;
*score_ptr += 5;
std::cout << "score=" << score << " same-address="
<< std::boolalpha << (score_ptr == &score) << '\n';
}
score=75 same-address=true
Comparación entre C y C++
El puntero score_ptr contiene la dirección de score, así que *score_ptr += 5 en realidad suma 5 a la propia variable score, que pasa de 70 a 75. La comparación score_ptr == &score confirma que las dos direcciones son iguales. C++ sigue usando punteros sin procesar (raw pointer) cuando solo hace falta acceder a los datos sin gestionar la memoria, pero prefiere las referencias cuando la variable nunca debe estar vacía.
La propiedad y la liberación de la memoria dependen por completo del programador.
Los contenedores y RAII liberan automáticamente los recursos cuando el objeto llega al final de su vida.
Ejercicios de práctica
Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.
- Prueba con punteros nulos y con fallos al reservar memoria.
- Ejecuta el programa con AddressSanitizer y UndefinedBehaviorSanitizer para detectar errores de memoria.
- Deja claro qué puntero es dueño de la memoria y cuál solo sirve para leer.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
Todos los retos