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 | modifica sorgente]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 | modifica sorgente]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]
).