C/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
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]).