Los punteros en C++ son variables que almacenan direcciones de memoria de otras variables. Las direcciones de memoria determinan la ubicación de las variables en la computadora. De este modo, un puntero permite acceder tanto a la dirección de memoria de una variable como a su valor. Lo veremos mejor con los siguientes ejemplos.
El operador &
Con el operador & obtenemos la dirección de memoria de una variable en código hexadecimal.
#include <iostream> #include <string> using namespace std; int main() { string city = "London"; cout << &city << endl; // 0x7ffe3f482e10 return 0; }
Ahora que ya sabemos como obtener una dirección de memoria, el siguiente paso será crear un puntero y asignarle una dirección para que apunte a una variable.
Crear el puntero con el operador *
La sintaxis para crear una variable puntero: “tipo* identificador”.
El tipo debe coincidir con el de la variable de la que obtenemos la dirección de memoria. El identificador es el nombre del puntero. Y el operador * determina que esta variable es un puntero.
En el siguiente ejemplo creamos un puntero a un string. Al puntero ptr le asignamos la dirección de memoria de &city. Ahora, desde ptr tenemos acceso tanto a la dirección de memoria de city como a su valor.
#include <iostream> #include <string> using namespace std; int main() { string city = "London"; string* ptr = &city; cout << ptr << endl; // 0x7ffe3f482e10 cout << *ptr << endl; // London return 0; }
Aquí el operador * actúa de dos maneras diferentes:
- Creador de un puntero (string* ptr)
- Como operador de desreferencia o indirección (*ptr) para acceder al valor de la variable.
Cambiar el valor de un puntero
Si cambiamos el valor del puntero ptr también cambiará el valor de la variable city.
#include <iostream> #include <string> using namespace std; int main() { string city = "London"; string* ptr = &city; *ptr = "Barcelona"; cout << *ptr << endl; // Barcelona cout << city << endl; // Barcelona return 0; }
Punteros a punteros
Los punteros a punteros se definen con la siguiente sintaxis: “tipo** identificador”. Se trata de punteros que contienen la dirección de memoria de otros punteros.
#include <iostream> using namespace std; int main() { int n = 5; int* ptr = &n; int** ptr2 = &ptr; cout << ptr << endl; // 0x7ffc97601224 cout << *ptr2 << endl; // 0x7ffc97601224 cout << *ptr << endl; // 5 cout << **ptr2 << endl; // 5 return 0; }
En el anterior ejemplo creamos un puntero a un puntero a un entero (int** ptr2). A ptr2 le asignamos la dirección de memoria de un puntero a un entero (int* ptr), que a su vez contiene la dirección de memoria del entero int n.
Fuente: learn.microsoft
0 comentarios