28 - Los punteros en C++


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>;

Punteros a tipo de dato numérico

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

Problema 1:

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.

Programa:

#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

Problemas propuestos

  1. Hacer el gráfico de la memoria e indicar que se imprime en pantalla al ejecutar este programa:
    #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;
    }
    
  2. Definir tres variables enteras e inicializarlas con los valores 5,10 y 15. Luego definir una variable puntero a entero. Hacer que dicha variable apunte sucesivamente a las distintas variables definidas previamente e imprimir su contenido.
  3. Definir dos variables float y un puntero a un tipo de dato float. Hacer que el puntero guarde sucesivamente las direcciones de la primera y segunda variable y cambiar el contenido de las mismas por asignación. Imprimir las dos variables de tipo float.
Solución
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

Retornar