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)); vettore // allocazione del // 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: 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;