Abbiamo studiato come accedere agli elementi di un array per mezzo di un indice, adesso vedremo come accedere per mezzo di un puntatore.
Fondamenti solidi di programmazione
Impara le basi della programmazione in C in modo semplice, pratico ed efficace. Variabili, cicli, funzioni, logica e algoritmi.
- ⏱️ 9 ore di corso registrato
- 🧩 Più di 50 algoritmi risolti passo passo
- 🎯 Livello base
- 💻 100% online, fruibile quando vuoi
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
Strutture complesse in C
Esercizio sulle struct in C
Typedef struct C
Media per riga e per colonna
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Come sommare due matrici
Sommare dei numeri di una matrice
Matrice trasposta
Prodotto tra matrici
Ricerca elementi in una matrice
Inserire dati in una matrice
Tavola pitagorica in C
Array multidimensionali
Programma sui triangoli in C
Media dei numeri in un array
Array con numeri random
Quick sort in C
Selection sort in C
Merge sort in C
Insertion Sort in C