-
Notifications
You must be signed in to change notification settings - Fork 1
Apuntadores
#include <iostream>
using namespace std;
int main(){
int a;
int *ptr=&a;
cout << "El valor de a es: " << a << '\n';
cout << "Su direccion es: " ptr << endl;
return 0;
}
Los apuntadores son una variable especial que apuntan a otras variables, es decir guardan direcciones de memoria, y es una de las herramientas mas útiles a la hora de hacer programas, ya que nos permiten manejar memoria dinámica aunque eso también tiene sus riesgos, ya que sin querer podrías acceder a espacios de memoria del sistema, aunque C++ tiene una medida de protección contra esto.
Al igual que otras variables los punteros tienen tipo por lo que la variable a la que apunten deben tener el mismo tipo, excepto el apuntador de tipo vacío o apuntador genérico que veremos mas adelante.
int *ptrInt;
float *ptrFloat;
double *ptrDouble;
char *ptrChar;
Solo hacemos uso del operador de indirección *
, aunque sea el mismo operador que el de multiplicación, si se trabaja con punteros cambia su funcionamiento.
int a;
float b;
double c;
char d;
int *ptrInt = &a;
float *ptrFloat = &b;
double *ptrDouble = &c;
char *ptrChar = &d;
Para inicializar un puntero, simplemente usamos el operador de dirección &
delante de la variable a la que queremos que apunte.
Como con otras variables en los apuntadores es posible hacer las operaciones de suma y resta, sin embargo en realidad lo que hace es cambiar la dirección de memoria, ya sea a una posición mas grande o más chica según la operación en función de los bits del tipo de dato que estemos usando.
int a = 10;
int *ptr = &a;
cout << ptr << '\n';
ptr++;
cout << ptr << endl;
Tendríamos la siguente salida
0x7ffe2a301fa4
0x7ffe2a301fa8
Debido a que es un apuntador de tipo int
, se desplaza 4 bytes de memoria o 32 bits.
El operador de dirección se puede usar con cualquier variable, no solamente para declarar apuntadores, por ejemplo para comprobar la dirección a la que se apunta
double a = 10;
double *ptr = &a;
cout << &a << '\n';
cout << ptr << endl;
Y la salida sería la misma, recordar que double
ocupa 8 bytes de memoria.
Es un apuntador a tipo vacío o void
que puede apuntar a cualquier tipo, es muy útil a la hora de trabajar con distintos tipos de datos sin embargo se desaconseja el uso sin realizar un cast, ya que se pueden tener problemas al querer acceder al contenido de la dirección a la que apunta.
Se puede usar sin realizar cast
float a = 3.25;
void *ptr = &a;
cout << &a << '\n';
cout << ptr << endl;
O haciendo cast
float a = 3.25;
void *ptr;
ptr = (float*) &a;
cout << &a << '\n';
cout << ptr << endl;
De esta manera el compilador sabe como tratar la reserva de memoria para ptr
, aunque parezca que sería mejor utilizar un apuntador a float
, bueno al menos para este caso si, pero teniendo una estructura como listas podríamos hacer registros que contengan diferentes tipos de datos u otras estructuras.
Introducción | Arreglos y apuntadores | Arreglos de apuntadores | Apuntadores a funciones |
---|