Puntatori Linguaggio C
Puntatori in C Un puntatore è una variabile che contiene un indirizzo di memoria. Quando una variabile contiene l’indirizzo di un’altra variabile, si dice che la prima punta alla seconda. Utilità dei puntatori: Nelle funzioni (passaggio per referenza, che permette la modifica degli argomenti in input); Per l’allocazione dinamica della memoria (definizione di strutture dati di dimensione variabile)
Definizione e operazioni sui puntatori Dichiarazione e definizione di un puntatore che punta a una locazione di memoria contenenti un certo tipo di dato: tipo *nome_variabile es. int *x; char *y; & (operatore unario che restituisce l’indirizzo di memoria dell’operando) Es. se la variabile n è allocata all’indirizzo 1200. Dopo l’esecuzione dell’istruzione: x=&n il valore di x è 1200.
Operatori * (operatore unario che restituisce il valore della locazione di memoria puntata dall’operando). Es. se la variabile x ha come valore 1200, e la locazione 1200 contiene il valore 555. Dopo l’esecuzione dell’istruzione: y=*x; Il valore di y è 555. I puntatori possono essere confrontati tra di loro * è il complemento di &. void main(void){ void main(void){ int x,y; int x,y; int *p; è equivalente a y=x; p=&x; } y=*p; }
Allocazione dinamica della memoria malloc() alloca porzioni contigue di memoria e restituisce l’indirizzo della locazione iniziale void *malloc(numero di byte) free() libera porzioni di memoria void free(void *p) Es. char *p; p=malloc(1000); alloca 1000 byte in sequenza e p punta alla locazione iniziale. La zona di memoria allocata attraverso malloc si trova in un'area di memoria speciale, detta heap (memoria dinamica).
NULL La costante NULL è di tipo void* (quindi compatibile con tutti i tipi puntatore) indica un puntatore che non punta a nulla: non può essere dereferenziato
Esempio – vettore dinamico int main (){ int dimesione,i; int *vet; //sarà l’array dinamico printf(“Dimensione dell’array da allocare?"); scanf("%d",&dimensione); vet=malloc(dimensione*sizeof(int)); // allocazione del vettore // esempio di inserimento valori for(i=0;i<dimensione;i++) { printf(“Inserisci elemento v[%d]->",i); scanf("%d",&vet[i]); } return 0;
Puntatori a strutture Esempio di struttura: Notazione errata *p1.x=5; struct punto { double x; double y; }; struct punto p1; struct punto *pun; pun=&p1; Notazione errata *p1.x=5; Notazione corretta (*p1).x=5; Notazione migliore p1->x=5;