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 pun2
Este 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