C Language Aritmética de puntero


Ejemplo

Además de puntero

Dado un puntero y un tipo escalar N , se evalúa como un puntero al elemento N th del tipo apuntado a que se corresponde directamente con el objeto apuntado en la memoria.

int arr[] = {1, 2, 3, 4, 5};
printf("*(arr + 3) = %i\n", *(arr + 3)); /* Outputs "4", arr's fourth element. */

No importa si el puntero se usa como el valor de operando o el valor escalar. Esto significa que cosas como 3 + arr son válidas. Si arr[k] es el miembro k+1 de una matriz, arr+k es un puntero a arr[k] . En otras palabras, arr o arr+0 es un puntero a arr[0] , arr+1 es un puntero a arr[2] , y así sucesivamente. En general, *(arr+k) es igual que arr[k] .

A diferencia de la aritmética habitual, la adición de 1 a un puntero a un int agregará 4 bytes al valor de la dirección actual. Como los nombres de matriz son punteros constantes, + es el único operador que podemos usar para acceder a los miembros de una matriz mediante notación de puntero utilizando el nombre de la matriz. Sin embargo, al definir un puntero a una matriz, podemos obtener más flexibilidad para procesar los datos en una matriz. Por ejemplo, podemos imprimir los miembros de una matriz de la siguiente manera:

#include<stdio.h>
static const size_t N = 5
    
int main()
{
    size_t k = 0;
    int arr[] = {1, 2, 3, 4, 5};
    for(k = 0; k < N; k++)
    {
        printf("\n\t%d", *(arr + k));
    }
    return 0;
}

Al definir un puntero a la matriz, el programa anterior es equivalente a lo siguiente:

#include<stdio.h>
static const size_t N = 5
    
int main()
{
    size_t k = 0;
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr; /* or int *ptr = &arr[0]; */
    for(k = 0; k < N; k++)
    {
        printf("\n\t%d", ptr[k]);
        /* or   printf("\n\t%d", *(ptr + k)); */
        /* or   printf("\n\t%d", *ptr++); */
    }
    return 0;
}

Ver que se acceda a los miembros de la matriz arr utilizando los operadores + y ++ . Los otros operadores que se pueden usar con el puntero ptr son - y -- .

Resta de puntero

Dados dos punteros al mismo tipo, se evalúa en un objeto de tipo ptrdiff_t que contiene el valor escalar que debe agregarse al segundo puntero para obtener el valor del primer puntero.

int arr[] = {1, 2, 3, 4, 5};
int *p = &arr[2];
int *q = &arr[3];
ptrdiff_t diff = q - p;

printf("q - p = %ti\n", diff); /* Outputs "1". */
printf("*(p + (q - p)) = %d\n", *(p + diff)); /* Outputs "4". */