C/Vettori e puntatori/Interscambiabilità tra puntatori e vettori

Indice del libro

Vettori e puntatori sono strettamente legati fra loro.

Infatti, se si usa il nome di un array senza indice, si ottiene un puntatore al suo primo elemento.

Perciò:

a == &a[0]
*a == a[0]

Esempio:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    printf("%i", prova());
    return 0;
}
int prova(void)
{
    int a[3];
    a[0]=78;
    a[1]=93;
    return (*a==a[0]);
}

La funzione prova() restituirà 1 (true).

Come scritto nella pagina sui vettori, è possibile passare un array ad una funzione passando il puntatore al suo primo elemento, per il motivo sopra citato.

Usare l'aritmetica dei puntatori per accedere ad un array modifica

L'aritmetica dei puntatori permette di accedere a qualsiasi elemento di un array addizionando un certo valore al puntatore al primo elemento dell'array.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char a[7]={'a', 'b', 'c', 'd', 'e', 'f', 'g'};
    printf("%c %c", a[3], *(a+3));
    return 0;
}

Questo programma restituirà d d, perché a[3] e *(a+3) sono uguali.

Un esempio più complesso modifica

Si può usare l'aritmetica dei puntatori anche per accedere ad array multidimensionali, perché gli elementi, per il compilatore, sono ordinati uno dopo l'altro in tutti i tipi di array. In questo esempio si prenderà in considerazione un array 5×3.

#include <stdio.h>
#include <stdlib.h>
#define LunR 5
#define LunC 3

int main(void)
{
    char a[LunC][LunR]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
                        'i', 'j', 'k', 'l', 'm', 'n', 'o'};
    printf("%c %c", a[1][2], *((char *)a+1*LunR+2));
    return 0;
}

Questo programma restituirà h h. È stata operata una conversione cast sul puntatore a per assicurarsi che fosse un puntatore ad un valore char. Si è poi addizionato a questo puntatore una riga (5 elementi) e 2 elementi, per ottenere il carattere che sta sulla seconda riga alla terza colonna (ricordarsi che il primo elemento di un array è [0][0]).