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;
void 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
    cin.get();
}
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;
void 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;
    cin.get();
}
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;
void 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;
    cin.get();
}
Este proyecto lo puede descargar en un zip desde este enlace :Puntero3.zip
#include<iostream>
using namespace std;
void main()
{
    float f1, f2;
    float *pf;
    pf = &f1;
    *pf = 10.5;
    pf = &f2;
    *pf = 20.2;
    cout << f1;
    cout << "\n";
    cout << f2;
    cin.get();
}
Este proyecto lo puede descargar en un zip desde este enlace :Puntero4.zip