C Language Puntatore aritmetico


Esempio

Aggiunta puntatore

Dato un puntatore e un tipo scalare N , valuta in un puntatore il N elemento del tipo puntato che riesce direttamente nell'oggetto puntato in memoria.

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

Non importa se il puntatore viene usato come valore dell'operando o come valore scalare. Ciò significa che cose come 3 + arr sono valide. Se arr[k] è il membro k+1 di un array, quindi arr+k è un puntatore a arr[k] . In altre parole, arr o arr+0 è un puntatore a arr[0] , arr+1 è un puntatore a arr[2] , e così via. In generale, *(arr+k) è uguale a arr[k] .

Diversamente dalla solita aritmetica, l'aggiunta di 1 a un puntatore a un int aggiungerà 4 byte al valore dell'indirizzo corrente. Poiché i nomi degli array sono puntatori costanti, + è l'unico operatore che possiamo usare per accedere ai membri di un array tramite la notazione del puntatore usando il nome dell'array. Tuttavia, definendo un puntatore a un array, possiamo ottenere una maggiore flessibilità per elaborare i dati in un array. Ad esempio, possiamo stampare i membri di un array come segue:

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

Definendo un puntatore all'array, il programma di cui sopra è equivalente al seguente:

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

Vedi che i membri dell'array arr sono accessibili usando gli operatori + e ++ . Gli altri operatori che possono essere utilizzati con il puntatore ptr sono - e -- .

Sottrazione puntatore

Dato due puntatori allo stesso tipo, valuta in un oggetto di tipo ptrdiff_t che contiene il valore scalare che deve essere aggiunto al secondo puntatore per ottenere il valore del primo puntatore.

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". */