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;
Apple iPad (7th Gen) (10.2 pollici, Wi-Fi, 32GB) - Grigio Siderale (Ricondizionato)
267,89 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)HP, Pc desktop i7 pronto all'uso,16 Gb Ram, ssd 512Gb, Wi Fi, Libre Office, Windows 11 PRO, Computer fisso Pc i7 Pornto all'Uso (Ricondizionato)
155,00 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Apple iPad 9,7 (6th Gen) 128GB WiFi - Cellular - Grigio Siderale - Sbloccato (Ricondizionato)
250,88 € (a partire da 18 Marzo 2024 15:18 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)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
Samsung Galaxy Chromebook Go, Computer Portatile XE340XDA-KA1IT Chrome OS, Processore Intel Celeron, Display Screen 14” Full HD LED, RAM 4GB, Memoria eMMC 64GB, USB-C, Silver (Versione Italiana)
259,00 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)ASUS Vivobook 15 F1502ZA, Notebook con Monitor 15,6" Antiglare, Intel Core 12ma gen i5-1235U, RAM 8GB, 512GB SSD PCIE, Windows 11 Home, Grafica Intel Iris Xe, Argento
549,00 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)HP, Probook, Pc Portatile Notebook Intel i5-6th, Display HD da 15,6", Ram 16Gb, SSD 512Gb, Pacchetto Libre, W10 Chiavetta FInger Print (Ricondizionato)
345,00 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)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