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


Los operadores ++ y -- con tipo de dato puntero tienen un funcionamiento distinto que cuando incrementamos o decrementamos una variable entera.

Cuando utilizamos el operador ++ con un puntero incrementa la variable según el tamaño del tipo de dato que apunta. Si es un puntero a entero incrementa la dirección en 4 bytes (en un sistema operativo de 32bits), si es un puntero a tipo char incrementa la dirección en 1 byte etc.

Un ejemplo de como utilizar la sintaxis de punteros:

#include<stdio.h>
#include<conio.h>

int main()
{
    int vec[5]={10,20,30,40,50};
    int *pe;
    pe=vec;
    printf("%i\n",*pe);  // 10
    pe++;
    printf("%i\n",*pe);  // 20
    pe++;
    printf("%i\n",*pe);  // 30
    pe--;
    printf("%i\n",*pe);  // 20
    getch();
    return 0;
}

Como vec y pe son punteros a enteros luego podemos asignar vec a la variable pe:

    pe=vec;

En este momento pe tiene la dirección de la primer componente del vector, luego si imprimimos lo que apunta pe tenemos el valor 10:

    printf("%i\n",*pe);  // 10

El operador ++ incrementa el contenido de la variable pe tantos bytes como sea el tamaño de las variables int en nuestro sistema operativo, por eso luego si accedemos a lo apuntado por pe tenemos el valor 20:

    pe++;
    printf("%i\n",*pe);  // 20

Un punto importante es que el vector vec si bien es un puntero no podemos utilizar el operador ++ o --, siempre apuntará a la primera componente del vector.

Problema 1:

Desarrollar un programa para administrar un vector de 5 enteros.
En la función de carga e impresión utilizar la sintaxis de punteros para acceder a sus elementos (no utilizar la sintaxis de subíndice)

Programa: programa155.c

Ver video

#include<stdio.h>
#include<conio.h>

#define TAMANO 5

void cargar(int *pe)
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("Ingrese elemento:");
        scanf("%i",&*pe);
        pe++;
    }
}

void imprimir(int *pe)
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("%i ",*pe);
        pe++;
    }
}


int main()
{
    int vec[TAMANO];
    cargar(vec);
    imprimir(vec);
    getch();
    return 0;
}

En la función de carga le pasamos en cada vuelta del for la dirección que apunta la variable pe:

        scanf("%i",&*pe);

Y seguidamente incrementamos el puntero pe con el operador ++, con esto logramos que apunte a la siguiente componente del vector.

De forma similar en la impresión utilizamos la sintaxis de puntero para acceder a cada componente:

void imprimir(int *pe)
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("%i ",*pe);
        pe++;
    }
}

Problema propuesto

Solución
programa156.c

#include<stdio.h>
#include<conio.h>

int largo(char *cad)
{
    int cant=0;
    while(*cad!='\0')
    {
        cant++;
        cad++;
    }
    return cant;
}


int main()
{
    char nombre[10]="Maria";
    printf("El nombre: %s tiene %i caracteres", nombre, largo(nombre));
    getch();
    return 0;
}

Retornar