Los apuntadores (tambien conocidos como punteros) son una de las más poderosas características del lenguaje de programación C, además es una de las mas difíciles de manejar.
Los apuntadores brindan la posibilidad de crear y manipular estructuras de datos dinámicas, aquellas que pueden crecer y reducirse, tales como listas enlazadas, pilas, colas y árboles, ademas de tener una estrecha relacion con los arreglos y las cadenas de caracteres o string.
Los apuntadores contienen direcciones de memoria como sus valores.
Generalmente una variable contiene un valor específico.
Un apuntador contiene la dirección de memoria de una variable que contiene un valor específico.
En este sentido, una variable se refiere directamente a un valor y un apuntador se refiere a un valor indirectamente.
El hecho de referirse a un valor especifico a través de un apuntador sin hacer referencia a la variable que lo contiene, es llamado indirección.
Los apuntadores, al igual que otras variables, deben ser declarados antes de ser usados.
int *countPtr; // Se declara un apuntador a una variable con valor entero
int count; // Se declara una variable con valor entero
count = 7; // Se asigna un valor entero a la variable entera count
Declara la variable *countPtr
como un apuntdor a una variable de tipo entero, además la variable count
es declarada para ser una variable de tipo entero.
Toda variable que sea declarada como un apuntador debe estar precedida por el simbolo asterisco (*).
Al declarar y asignar los valores correspondientes, la estructura de datos queda como se indica a continuacion:
count count
referencia directamente una variable cuyo valor es 7.
7
*countPtr count *countPtr
referencia indirectamente una variable cuyo valor es 7
--------> 7
La siguiente declaracion de variables:
double *xPtr, *yPtr;
Indica que ambas variables, *xPtr*
y *yPtr*
son apuntadores a valores de tipo double.
Los apuntadores pueden ser declarados para apuntar a objetos de cualquier tipo de datos.
Los apuntadores deben ser inicializados cada vez que se declaran o en una sentencia de asignacion. Un apuntador con el valor 0 (cero) o NULL apunta a ningun lado, en C++ se usa preferentemente el valor 0 (cero). La constante simbolica NULL es definida en el archivo de cabecera iostream. Cuando se asigna 0 a un apuntador, este se convierte a un apuntador del tipo apropiado. El valor de 0 es el unico valor entero que puede ser asignado a un apuntador sin hacer casting de entero a apuntador primero. Se debe preceder el simbolo asterisco (*) a todas las variables de tipo apuntador, aunque se declaren en una misma linea separada por comas. Se debe inicializar los apuntadores para evita que apunten a zonas desconocidas de memoria.
El operador unario & es llamado el operador de direccion y devuelve la direccion de un operando.
Por ejemplo, a continuacion se cedlara una variable entera y un apuntador a entero.
int y = 5;
int *yPtr;
La siguiente sentencia asigna la direccion de la variable y al apuntador yPtr
yPtr = &y;
Luego de la ejecucion de esta sentencia se dice que el apuntador yPtr apunta a la direccion de la variable y.
A continuacion se muestra una representacion esquemática de la memoria despues de la asignacion anterior:
yPtr y
--------> 5
En la figura se mestra la relacion del apuntador a través de una flecha del apuntador hacia el objetivo que este apuntando.
La siguiente figura muestra la representacion del puntero en memoria, asumiendo que la variable entera y este almacenada en la dirección de memoria 6000 y la variable de tipo apuntador yPtr esta almacenada en la direccion 5000.
El opreador de dirección solo puede ser aplicado a un elemento que tenga un valor asignado directamente, tal como el nombre de una variable. El operador de direccion no puede ser aplicado a constantes o expresiones
| *yPtr*
5000 | 6000
| *y*
6000 | 5
El operador asterisco (*) comunmente conocido como operador de indireccion, devuelve un alias del elemento al cual apunta, por ejemplo la siguiente sentencia:
cout << *yPtr << endl;
Muestra el valor de la variable y, el numero entero 5, similas a como lo haria la siguiente sentencia:
*yPtr;
cin >>*yPtr;
A continuacion se muestra un programa que opera con apuntadores en lenguaje C++:
Primeramente se importa el archivo de cabecera necesario para usar las sentencias de entrada y salida de informacion
#include <iostream>
using std::cout;
using std::endl;
Luego se define el inicio de la funcion principal:
int main()
A continuacion se declaran variables a usar
ìnt a; //a es una variable de tipo entero
int *aPtr; //aPtr es un apuntador a un entero
Se asignan los valores correspondientes a las variables declaradas:
a = 7; //se le asigna a la variable a el valor entero 7
aPtr = &a; //al apuntador aPtr se le asigna la direccion de la variable a
A continuacion se muestran en pantalla los valores asignados a las diferentes variables:
Se muestra en pantalla el valor de la direccion de la variable entera a
cout << "La direccion de la variable a es " << &a << endl;
Se muestra en pantalla el valor que contiene el aputnador aPtr
cout << "El valor de aPtr es " << aPtr << endl;
Se muestra en pantalla el valor de la variable a
cout << "El valor de la variable a es " << a << endl;
Se muestra en pantalla el valor apuntado indirectamene por *aPtr
cout << "El valor de *aPtr es " << *aPtr << endl;
Los operadores de direccion & y de apuntador * son operadores inversos
cout << "&*aPtr = " << &*aPtr << endl;
cout << "*&aPtr = " << *&aPtr << endl;
Note que al ejecutar el codigo indicado, el valor de la direccion de la variable entera a es identico al valor contenido en la varialbe *aPtr. Los operadores & (operador de direccion) y * (operador de apuntador) son operadores inversos, por lo tanto aplicarlos en cualquier orden genera el mismo resultado.
Como programar C++ Deitel
https://drive.google.com/open?id=1yWPwF7v5D2_9G9QRtwKMFubM9iE5g-cq
Apuntadores. Definición. Disponible en:
http://www.utm.mx/~mgarcia/PE7(Apuntadores).pdf
Apuntadores en C y C++. Disponible en:
https://utch2009.files.wordpress.com/2010/04/apuntadores.pdf
Jensen, T. Tutorial sobre apuntadores y arreglos en C. https://drive.google.com/open?id=1LPeIGP9bmaJnMOj5L0NIqBVP5zn7sVI-
Introducción a punteros. Video disponible en:
Como usar correctamente los apuntadores. Video disponible en: