Lecciones del módulo (2/2)
Punteros
Los punteros son una de las características más potentes y distintivas de C++. Permiten acceder directamente a la memoria física del ordenador, lo que permite una gestión eficiente de los recursos y un alto rendimiento.
1. ¿Qué es la Memoria y una Dirección?
Cada variable que declaras en tu programa se almacena en una celda de la memoria RAM. Cada celda tiene una dirección de memoria única (normalmente expresada en formato hexadecimal, ej. 0x7ffee3bf87ac).
C++ nos permite obtener la dirección de memoria de cualquier variable utilizando el operador de dirección &:
int x = 42;
std::cout << &x; // Stampa l'indirizzo di memoria di x (es. 0x7ffee3bf87ac)
2. Definición de Puntero
Un puntero es una variable especial que almacena como valor la dirección de memoria de otra variable.
La sintaxis requiere el uso del asterisco * después del tipo de datos:
int x = 42;
int* ptr = &x; // ptr è un puntatore a intero che contiene l'indirizzo di x
3. El Operador de Dereferencia (*)
Para acceder o modificar el valor almacenado en la dirección a la que apunta un puntero, utilizamos el operador de dereferencia (o indirección), también representado por el símbolo *:
int x = 42;
int* ptr = &x;
std::cout << *ptr; // Stampa 42 (il valore a cui punta ptr)
*ptr = 100; // Modifica il valore di x tramite il puntatore
std::cout << x; // Ora stampa 100!
4. Punteros Nulos: nullptr
Un puntero que no apunta a ninguna dirección válida debe inicializarse con la palabra clave nullptr (introducida en C++11):
int* ptr = nullptr; // Puntatore nullo e sicuro
Pruébalo tú mismo
En el main hay una variable value inicializada en 42. Declara un puntero a entero ptr que apunte a la dirección de value. Utiliza la dereferencia de ptr para establecer el valor de value en 100, finalmente imprime value usando std::cout.
Mostrar pista
Declara el puntero con `int* ptr = &value;`, modifica el valor dereferenciando `*ptr = 100;`, y imprime `std::cout << value;`.
Solución disponible después de 3 intentos
Define una función doubleValue que acepte un puntatore a entero (int* ptr) y multiplique por 2 el valor al que apunta (si el puntero no es nulo). En el main, llama a doubleValue pasándole la dirección de la variable num y imprímela.
Mostrar pista
La función debe aceptar `int* ptr`. En su interior, usa `*ptr = (_ptr) _ 2`. En el main llámala con `doubleValue(&num);`.
Solución disponible después de 3 intentos
Dado el código mostrado, ¿qué expresión permite modificar directamente el valor de a estableciéndolo en 10?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?