31 - Operadores ++ y -- con variables de tipo puntero


Los operadores de incremento y decremento ++ y -- pueden utilizarse con punteros.
Estos operadores aplicados a un puntero incrementan o decrementan la dirección que contiene el puntero según el tipo de dato a que apunta. Si a un puntero a entero le aplicamos el operador ++, incrementa la dirección en 4 bytes (puede depender del sistema operativo). Si este puntero a entero almacena la dirección 5000, al aplicarle el operador ++ sucesivamente la dirección irá aumentando 5004, 5008, 5012, 5016, etc.

Si a un puntero a float le aplicamos el operador ++, incrementa la dirección en 4 bytes (puede depender del sistema operativo). Si este puntero almacena la dirección 5000, al aplicarle el operador ++ sucesivamente la dirección irá aumentando 5004, 5008, 5012, etc.

Si a un puntero a char le aplicamos el operador --, decrementa la dirección en 1 byte (puede depender del sistema operativo). Si este puntero almacena la dirección 5000, al aplicarle el operador -- sucesivamente la dirección irá disminuyendo: 4009, 4008, 4007, 4006, etc.

Problema

Programa:

#include<iostream>

using namespace std;

int main()
{
    char cad[5];
    strcpy_s(cad, 5, "Sol");
    char *pc;
    pc = cad;
    cout << pc;        //imprime Sol
    cout << "\n";
    pc++;
    cout << pc;        //imprime ol
    cout << "\n";
    pc++;
    cout << pc;        //imprime l
    cout << "\n";
    pc--;
    cout << pc;        //imprime ol
    cout << "\n";
    int x[5] = { 10, 50, 100, 99, 33 };
    int *pe;
    pe = &x[3];
    cout << *pe;    //imprime 99
    cout << "\n";
    pe--;
    cout << *pe;    //imprime 100
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : PunteroOperador1.zip

Seguimiento del ejemplo:

- Definimos una cadena:
char cad[5];
	Dir. de Mem.	Contenido	Nombre de variable
	1000	        1004         	cad
	1004            		[0]
	1005		                [1]
	1006		                [2]
	1007		                [3]
	1008		                [4]

- Cargamos la cadena:
strcpy_s (cad, 5, "Sol");
	Dir. de Mem.	Contenido	Nombre de variable
	1000	        1004	        cad
	1004	        'S'	        [0]
	1005	        'o'      	[1]
	1006	        'l'      	[2]
	1007	        '\0'    	[3]
	1008		                [4]

- Definimos un puntero a char:
char *pc;
	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009				pc

- Le asignamos al puntero el contenido de la cadena:
pc=cad;
	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1004		pc

- Imprimimos donde apunta el puntero:
cout<<pc; //imprime Sol
Imprime desde la dirección 1004 hasta encontrar el terminador de cadena.

- Incrementamos el puntero: 
pc++;
La dirección se incrementa en 1.
	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1005		pc

- Imprimimos donde apunta el puntero:
cout<<pc; //imprime ol
Imprime desde la dirección 1005 hasta encontrar el terminador de cadena.

- Incrementamos el puntero:		
pc++;
La dirección se incrementa en 1.

        Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1006		pc

- Imprimimos donde apunta el puntero:		
cout <<pc; //imprime l
Imprime desde la dirección 1006 hasta encontrar el terminador de cadena.

- Decrementamos el puntero:		
pc--;
La dirección se decrementa en 1.

	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1005		pc

- Imprimimos donde apunta el puntero:		
cout <<pc;   //imprime ol
Imprime desde la dirección 1005 hasta encontrar el terminador de cadena.


- Definimos e inicializamos un vector de enteros:
int x[5] ={10,50,100,99,33};

	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1005		pc
	1013		1017		x
	1017		10		[0]
  	1021		50		[1]
	1025		100		[2]
	1029		99		[3]
	1033		33		[4]

- Definimos un puntero a entero:
int *pe;
	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1005		pc
	1013		1017		x
	1017		10		[0]
	1021		50		[1]
	1025		100		[2]
	1029		99		[3]
	1033		33		[4]
	1037				pe
		
- Le asignamos al puntero la dirección  de la cuarta componente del vector:
pe = &x[3];
       Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1005		pc
	1013		1017		x
	1017		10		[0]
	1021		50		[1]
	1025		100		[2]
	1029		99		[3]
	1033		33		[4]
	1037		1029		pe

- Imprimimos donde apunta el puntero:
cout<<*pe; //99

- Decrementamos el puntero:
pc--;
La dirección se decrementa en 4.
	Dir. de Mem.	Contenido	Nombre de variable
	1000		1004		cad
	1004		'S'		[0]
	1005		'o'		[1]
	1006		'l'		[2]
	1007		'\0'		[3]
	1008				[4]
	1009		1005		pc
	1013		1017		x
	1017		10		[0]
	1021		50		[1]
	1025		100		[2]
	1029		99		[3]
	1033		33		[4]
	1037		1025		pe

- Imprimimos donde apunta el puntero:		
cout<<*pe; //imprime 100

Problema propuesto

  1. Plantear una clase para administrar un vector de 5 enteros. Definir además del método para cargar el vector un método que imprima las componentes empleando un puntero que avance por todas las direcciones de las componentes utilizando el operador ++.
Solución
#include<iostream>

using namespace std;

class Vector {
    int vec[5];
public:
    void cargar();
    void imprimir();
};

void Vector::cargar()
{
    for (int f = 0; f < 5; f++)
    {
        cout << "Ingrese componente:";
        cin >> vec[f];
    }
}

void Vector::imprimir()
{
    int *pe;
    pe = vec;
    for (int f = 0; f < 5; f++)
    {
        cout << *pe;
        pe++;
        cout << "-";
    }
}

int main()
{
    Vector vector1;
    vector1.cargar();
    vector1.imprimir();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace :PunteroOperador2.zip

Retornar