Punteros en C++
Holas, continuando con la temática de C++, el día de hoy vamos a revisar de una manera un tanto trivial lo que son los punteros en C++, para que sirven, cómo se declaran, cómo se asigna una dirección de memoria a un puntero y cómo manipular un objeto referenciado por un puntero.
El siguiente contenido hace suposición de que la persona que está leyendo este post tiene conocimiento de cómo se almacenan los datos en la memoria de un computador
Vamos a hacer una recapitulación rápida de cómo los datos son almacenados en un computador.
Sabemos que los computadores entienden valores binarios, es decir 0 y 1 llamados bit, un grupo de 8 bits es un byte u octeto y cada byte tiene una dirección en memoria, cuando desarrollamos software nuestros objetos por lo general ocupan mas de una dirección de memoria, en este caso la solución es manejar direcciones de memoria correlativas.
Si nuestro objeto ocupa 4 bytes y comienza en la direccion de memoria n, el objeto ocupará las direcciones de memoria n hasta n+3.
Puntero
Un puntero (Parecen dragones difíciles de conquistar, pero hay que tener un poco de paciencia para darnos cuenta que no son tan complicados como aparentan) es un tipo especial de objeto que contiene la dirección de memoria de otro objeto, pero ojo esta dirección almacenada en el puntero será la primera dirección de memoria del objeto al que queremos apuntar, es decir si nuestro objeto comienza en la dirección de memoria n y termina en la dirección de memoria n+15 a pesar de que nuestro objeto tenga 16 bytes, el puntero almacenará unicamente la dirección n.
El puntero deberá ser del mismo tipo que el objeto al que se está apuntando, si tenemos un objeto char nuestro puntero también deberá ser del tipo char
Declaración
Para declarar un puntero tenemos dos opciones:
- Especificar el tipo de puntero más su nombre precedido de un '*'
- Especificar el tipo de puntero mas '*' y luego su nombre
// Ejemplos de declaración de punteros
int *age;
float* weight;
Cualquiera de las dos formas es válida.
Debemos tener cuidado cuando realizamos varias declaraciones en la misma línea
int* a, b; // a es un puntero, pero b es un objeto de tipo int
int *a, *b; // Esta es la forma correcta de declarar punteros en la misma línea
Asignación
Para poder asignar la dirección de memoria de un objeto a un puntero debemos usar el operador &.
// Asignación de dirección de memoria a un puntero
int age=30
int *a;
a = &age; // Esta es la forma de asignar la dirección de memoria de un objeto a un puntero
No olvidarnos que el objeto y el puntero deben ser del mismo tipo, caso contrario nuestro programa no compilará
Manipular objetos referenciados por un puntero
En C++ el '*' puede ser utilizado para varias cosas, como son las siguientes:
- Operador de multiplicación
- Declaración de un puntero
- Operador de indirección
El operador de indirección permite acceder al objeto al que está apuntando un puntero.
Pueden consultar sobre el operador de indirección en los siguientes enlaces:https://es.wikipedia.org/wiki/Operador_de_desreferencia
https://www.it.uc3m.es/pbasanta/asng/course_notes/pointers_indirection_with_pointers_es.html
Para poder obtener el objeto a que está apuntando nuestro puntero, debemos utilizar '*' como operador de indirección.
int age=30;
int *d;
int temp;
d = &temp;
*d = age; // De esta manera utilizamos el operador de indirección
Esto realizará lo siguiente:
Asigne la dirección de memoria de temp al puntero d
Asigne el valor de age al objeto apuntado por dDicho de otra manera asignamos el valor de age a temp mediante un puntero
En el siguiente enlace tienen un ejemplo sobre punteros https://github.com/nano-bytes/cpp-compilation