Vi metto un po' di teoria sull'aritmetica dei puntatori, all'inizio puo' risultare pallosa ma poi vi assicuro che evita un sacco di bestemmie
[I]
int v = 5; /* v e' una variabile di tipo int*/
int *pv;
/* pv punta a un int */
pv = &v;
/* adesso pv punta a v */
&v indica l'indirizzo di memoria della variabile v
per ogni tipo di variabile, &*v == v
Il nome di un array e' il puntatore al suo primo elemento
int a[10];
if (a == &a[0])
printf("vero");
&a[i] = a+i;
a = *(a+i);
Vi sono differenze tra array e puntatori.
Definendo un array di n elementi di tipo T si alloca memoria contigua per n*sizeof(T) byte e si assegna l'indirizzo del primo di questi elementi al nome dell'array.