In questo articolo parleremo degli array e puntatori in C, ovvero di due elementi strettamente correlati tra loro. Infatti il compilatore gestisce sempre gli array con la logica dei puntatori.
Abbiamo studiato come accedere agli elementi di un array per mezzo di un indice, adesso vedremo come accedere per mezzo di un puntatore.
Dunque, se consideriamo ad esempio un array a e una variabile puntatore pa:
int a[10];
int *pa;
Potremmo utilizzare indifferentemente le due assegnazioni equivalenti:
pa=&a[0]; oppure
p=a;
Quindi, come potete notare, il nome dell’array è usato come un puntatore al suo primo elemento.
In C il nome dell’array, come nel nostro caso a, è una costante, non una variabile.
Esempio di utilizzo di Array e puntatori
Quindi, come dicevamo, il nome di un array è un puntatore costante al primo elemento di un array. Dunque facciamo questo semplice esempio, dove entrambi i printf stampano l’indirizzo del primo elemento di a.
#include <stdio.h>
int main() {
int a[5];
int *p;
p=a; //avrei potuto scrivere anche p=&a[0]
printf("indirizzo: %p ", a);
printf("indirizzo: %p ", p);
return 0;
}
Consideriamo adesso che l’espressione a[i] non fa altro che aggiungere al puntatore implicito a il valore della variabile intera i e applicare al risultato ottenuto l’operatore di in-direzione *. Dunque scrivere a[i] è equivalente a scrivere *(a+i).
Facciamo quindi un semplice esempio:
#include <stdio.h>
int main() {
int a[5]={6,3,4,8,9};
printf("\nValore: %d", a[2]);
printf("\nValore: %d", *(a+2));
return 0;
}
Entrambi i printf stamperanno il valore 4.
Anche se è meno comune, potrei scrivere anche in questo modo:
#include <stdio.h>
int main() {
int a[5]={6,3,4,8,9};
printf("\nValore: %d", 2[a]);
printf("\nValore: %d", *(2+a));
return 0;
}
Quindi c’è equivalenza tra puntatori e nomi di vettori, ma è importante dire che i puntatori rappresentano delle variabili, mentre i nomi dei vettori rappresentano delle costanti.
A un puntatore infatti viene allocata la memoria necessaria a contenere l’indirizzo dell’oggetto puntato mentre a un array viene assegnato lo spazio necessario per contenere gli elementi.
Precisiamo dunque che se p è un puntatore e a è un array, le operazioni: p++; e pure p=a; sono così consentite. Mentre non sono consentite a++; e anche a=p.
Altri esempi con array e puntatori
Facciamo altri semplici esempi per rafforzare quanto detto.
Prendiamo dunque un array a e sommiamo tutti gli elementi, noterete che entrambi i metodi proposti sono equivalenti.
#include <stdio.h>
int main() {
int a[5]= {9,5,6,7,10};
int i,sum=0;
for(i=0; i<5; i++)
sum += a[i];
printf("\nStampa la somma %d", sum);
sum=0;
for(i=0; i<5; i++)
sum += *(a+i);
printf("\nStampa la somma %d", sum);
return 0;
}
Anche con quest’altro esempio otterremo lo stesso risultato, fate attenzione all’ultimo ciclo for, che non fa uso dell’indice i ma del puntatore. Avrei potuto scrivere il secondo for anche così: for(; p<(a+5); p++).
#include <stdio.h>
int main() {
int a[5]= {9,5,6,7,10};
int *p = &a[0];
int i,sum=0;
for(i=0; i<5; i++)
sum += p[i];
printf("\nStampa la somma %d", sum);
sum=0;
for(p=a; p<(a+5); p++)
sum += *p;
printf("\nStampa la somma %d", sum);
return 0;
}
In questa lezione abbiamo parlato di array e puntatori, torneremo ancora a parlare di questo argomento nelle prossime lezioni, al fine di approfondire questi concetti.
Alcuni link utili:
Realizzare un menù di scelta in C
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice