Puntatori e Heap in C Prof.Ing.S.Cavalieri
Tipi Puntatori #include <stdio.h> int nNumber; NULL int *pPointer; main() { nNumber = 15; pPointer = &nNumber; printf( "nNumber is equal to : %d \n ",nNumber); *pPointer = 25; printf("nNumber is equal to: %d \n ",nNumber); } NULL
Tipi Puntatori #include<stdio.h> int n; int *p; main() { n=4; printf("\nContenuto di n = %d ",n); printf("\nIndirizzo di n = %p ",&n); p=&n; printf("\nContenuto di p = %p ",p); printf("\nIndirizzo di p = %p ",&p); *p=3; getchar(); } 1 byte n p 00404070 00404060 NULL 1 byte n p 00404070 00404060 4->3 00404070
Tipi Puntatori int x=-57, y=25; int *p; main() { p=&y; x=*p; } NULL 0040AB00 0040AB04 p 0040AB08 -57 25 4 byte int x=-57, y=25; int *p; main() { p=&y; x=*p; } NULL
Tipi Puntatori e Struct struct elemento { char cognome[15]; unsigned short eta; } x, *p; p=&x *p corrisponde a x, all’intero struct (*p).cognome corrisponde a x.cognome (*p).eta corrisponde a x.eta la parentesi è necessaria a causa della priorità l’operatore -> può essere usato in alternativa (*p).cognome equivale a p->cognome (*p).eta equivale a p->eta
Tipi Puntatori e Struct struct elemento { char cognome[15]; unsigned short eta; } x, *p; main() { p=&x; gets(x.cognome); gets(p->cognome); scanf("%u",&p->eta); flush(); scanf("%u",&(x.eta)); printf("\n%s",p->cognome); printf("\n%s",x.cognome); printf("\n%u",p->eta); printf("\n%u",x.eta); getchar(); }
Aritmetica dei Puntatori Incremento/Decremento di una variabile puntatore è legato alla dimensione della variabile puntata p++, p si incrementa di un numero di byte pari alla dimensione della variabile a cui punta p--, p si decrementa di un numero di byte pari alla dimensione della variabile a cui punta
Aritmetica dei Puntatori #include<stdio.h> int x=-57, y=25; int *p; main() { printf("\n&x=%p ",&x); printf("\n&y=%p ",&y); p=&x; printf("\nContenuto di p=%p ",p); p++; getchar(); } 00402000 00402004 00402000 00402004
Puntatori e Vettore Il nome della variabile vettore è l’indirizzo del primo elemento del vettore: int v[10]; v corrisponde a &v[0] v+i corrisponde a &v[i] (aritmetica dei puntatori!) v[i] corrisponde a *(v+i) scanf(“%d”,&v[i]) corrisponde a scanf(“%d”,v+i); printf(“%d”,v[i]) corrisponde a printf(“%d”,*(v+i));
Puntatori e Vettore #include<stdio.h> #define N 10 int vettore[N], i; main() { for (i=0; i<N; i++) scanf(“%d”,&v[i]); scanf(“%d”,v+i); getchar(); } Equivalente!
Allocazione di Memoria in C #include<stdlib.h> variabile puntatore= (cast) malloc (dimensione in byte); free (variabile puntatore); Da non dimenticare !!!!!! Si noti che la funzione free(), disalloca l'area puntata dal puntatore, ma non annulla il puntatore, ossia esso non viene posto a NULL, ma viene lasciato al valore attuale.
Allocazione di Memoria in C Heap Stack Area Statica Area Programma Area Dati
Allocazione di Memoria in C Heap Stack NULL Area Programma Area Dati pPointer Area Statica 0050AB00 25 #include <stdio.h> #include<stdlib.h> int *pPointer; main() { pPointer = (int *) malloc(sizeof(int)); *pPointer = 25; free (pPointer); }
Allocazione di Memoria in C Allocazione di un vettore Heap Stack NULL Area Programma Area Dati v Area Statica n 0050AB00 10 10*sizeof(float) #include<stdio.h> #include<stdlib.h> float *v; unsigned int n; main() { printf ("Inserisi il valore di n "); scanf("%u",&n); flush(); v=(float *)malloc(n*sizeof(float)); free(v); getchar(); }
Passaggio Parametri & - x 4 y 5 a b tmp #include <stdio.h> Return Address - x y 4 5 Record di Attivazione del main Link Dinamico a b Record di Attivazione della Procedura scambia tmp #include <stdio.h> void scambia ( int , int ); main(){ int x=4, y=5; scambia(x,y); printf("%d %d \n", x, y); } void scambia ( int a, int b){ int tmp=a; a=b; b=tmp;
Passaggio Parametri & x y a b tmp #include <stdio.h> void scambia ( int *, int *); main(){ int x=4,y=5; scambia(&x,&y); printf("%d %d \n",x,y); } void scambia ( int *a, int *b) { int tmp=*a; *a=*b; *b=tmp; Return Address - x y Record di Attivazione del Main Link Dinamico a b 4 5 Record di Attivazione della Procedura Scambia tmp
Passaggio Parametri & #define C 20 struct persona { char cognome[C], nome[C]; } ; void LeggiPersona(struct persona * ); main(){ struct persona elem; LeggiPersona(&elem); } void LeggiPersona(struct persona * p){ printf("\nInserisci il Cognome "); LeggiStringa(p->cognome,C); printf("\nInserisci il Nome "); LeggiStringa(p->nome,C);