Los punteros son variables que almacenan direcciones de memoria de otra variable.
El concepto de punteros es bastante complejo en un principio y puede llevar a pensar que no tienen una gran utilidad, muy lejos está la realidad.
El manejo de punteros es fundamental para conceptos futuros como la creación y liberación de objetos en tiempo de ejecución de un programa.
Hemos visto las estructuras de datos tipo vector y matrices, pero hay otro tipo de estructuras llamadas estructuras dinámicas que requieren obligatoriamente el empleo de punteros y resuelven otro conjunto de problemas que las estructuras estáticas no pueden.
Un puntero se definen de la siguiente manera:
<tipo de dato al que apunta> * <nombre del puntero>;
Definición de un puntero que apunta a un entero:
int *pe;
Asignación de contenido a un puntero:
int x=9; pe=&x;
Un puntero contiene una dirección, aquí le asignamos la dirección de la variable entera x, por eso debemos anteceder el símbolo &.
Podemos asignar un valor a lo apuntado por el puntero:
int x=9; pe=&x; *pe=5; // la variable x almacena 5 cout <<x; //5
Aquí le asignamos el valor 5 a la dirección a la cual apunta el puntero pe, es decir, a la variable entera x. Para indicar que el valor 5 es asignado a donde apunta el puntero pe, antecedemos al nombre del puntero el símbolo *.
Impresión:
No se puede imprimir el contenido de un puntero, que es una dirección de memoria, lo que imprimimos es el contenido de la variable a la cual apunta el puntero:
int x=9; pe=&x; cout <<*pe; // imprime 9
Confeccionar un programa que defina dos punteros a tipos de datos int y float. Acceder mediante estos punteros a otras variables de tipo int y float.
#include <iostream> using namespace std; int main() { int x = 10; int *pe; pe = &x; cout << x; // 10 cout << "\n"; cout << *pe; // imprime lo apuntado por pe: 10 cout << "\n"; *pe = 5; //asignamos 5 a lo apuntado por pe cout << x; // 5 cout << "\n"; float valor = 10.9; float *pf; pf = &valor; cout << *pf; //imprimime lo apuntado por pf: 10.9 return 0; }
Este proyecto lo puede descargar en un zip desde este enlace : Puntero1.zip
Vamos a hacer el seguimiento del programa anterior suponiendo que somos el sistema operativo asignando espacios en la memoria ram para localizar las variables de memoria:
Definimos la variable x (el sistema operativo le reserva espacio en la dirección de memoria 1000 y almacena en ese espacio el valor 10):
int x=10; Dir. de Mem. Contenido Nombre de variable 1000 10 x
Definimos otra variable pero en este caso de tipo puntero a entero y se le asigna el espacio de memoria 1004 (por el momento no guardamos nada en esta variable):
int *pe; Dir. de Mem. Contenido Nombre de variable 1000 10 x 1004 pe
Inicializamos el puntero pe con la dirección de la variable x:
pe=&x; Dir. de Mem. Contenido Nombre de variable 1000 10 x 1004 1000 pe
Modificamos el espacio apuntado por la variable pe (es decir a partir de la dirección 1000 almacenamos el valor 5):
*pe=5; Dir. de Mem. Contenido Nombre de variable 1000 5 x 1004 1000 pe
Ahora hacemos algo similar para trabajar con una variable float y un puntero a un tipo de dato float. Definimos una variable float:
float valor=10.9; Dir. de Mem. Contenido Nombre de variable 1000 5 x 1004 1000 pe 1008 10.9 valor
Definimos un puntero a tipo de dato float:
float *pf; Dir. de Mem. Contenido Nombre de variable 1000 5 x 1004 1000 pe 1008 10.9 valor 1012 pf
Recuperamos la dirección de la variable float:
pf=&valor; Dir. de Mem. Contenido Nombre de variable 1000 5 x 1004 1000 pe 1008 10.9 valor 1012 1008 pf
#include<iostream> using namespace std; int main() { int x1 = 50; int x2 = 100; int *pun1, *pun2; pun1 = &x1; pun2 = pun1; *pun1 = 2000; cout << x1; cout << "\n"; cout << x2; cout << "\n"; cout << *pun1; cout << "\n"; cout << *pun2; cout << "\n"; pun2 = &x2; x1 = 1; x2 = 2; cout << *pun1; cout << "\n"; cout << *pun2; cout << "\n"; *pun1 = 500; *pun2 = 600; cout << x1; cout << "\n"; cout << x2; return 0; }
int x1=50; Dir. de Mem. Contenido Nombre de variable 1000 50 x1 int x2=100; Dir. de Mem. Contenido Nombre de variable 1000 50 x1 1004 100 x2 int *pun1,*pun2; Dir. de Mem. Contenido Nombre de variable 1000 50 x1 1004 100 x2 1008 pun1 1012 pun2 pun1 = &x1; Dir. de Mem. Contenido Nombre de variable 1000 50 x1 1004 100 x2 1008 1000 pun1 1012 pun2 pun2 = pun1; Dir. de Mem. Contenido Nombre de variable 1000 50 x1 1004 100 x2 1008 1000 pun1 1012 1000 pun2 *pun1 = 2000; Dir. de Mem. Contenido Nombre de variable 1000 2000 x1 1004 100 x2 1008 1000 pun1 1012 1000 pun2 pun2 = &x2; Dir. de Mem. Contenido Nombre de variable 1000 2000 x1 1004 100 x2 1008 1000 pun1 1012 1004 pun2 x1 = 1; Dir. de Mem. Contenido Nombre de variable 1000 1 x1 1004 100 x2 1008 1000 pun1 1012 1004 pun2 x2 = 2; Dir. de Mem. Contenido Nombre de variable 1000 1 x1 1004 2 x2 1008 1000 pun1 1012 1004 pun2 *pun1 = 500; Dir. de Mem. Contenido Nombre de variable 1000 500 x1 1004 2 x2 1008 1000 pun1 1012 1004 pun2 *pun2 = 600; Dir. de Mem. Contenido Nombre de variable 1000 500 x1 1004 600 x2 1008 1000 pun1 1012 1004 pun2Este proyecto lo puede descargar en un zip desde este enlace :Puntero2.zip
#include<iostream> using namespace std; int main() { int x1 = 5; int x2 = 10; int x3 = 15; int *pe; pe = &x1; cout << *pe; cout << "\n"; pe = &x2; cout << *pe; cout << "\n"; pe = &x3; cout << *pe; return 0; }Este proyecto lo puede descargar en un zip desde este enlace :Puntero3.zip
#include<iostream> using namespace std; int main() { float f1, f2; float *pf; pf = &f1; *pf = 10.5; pf = &f2; *pf = 20.2; cout << f1; cout << "\n"; cout << f2; return 0; }Este proyecto lo puede descargar en un zip desde este enlace :Puntero4.zip