NULL Tipi Puntatori">

La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Puntatori e Heap in C Prof.Ing.S.Cavalieri. Tipi Puntatori #include int nNumber; int *pPointer; main() { nNumber = 15; pPointer = &nNumber; printf( "nNumber.

Presentazioni simili


Presentazione sul tema: "Puntatori e Heap in C Prof.Ing.S.Cavalieri. Tipi Puntatori #include int nNumber; int *pPointer; main() { nNumber = 15; pPointer = &nNumber; printf( "nNumber."— Transcript della presentazione:

1 Puntatori e Heap in C Prof.Ing.S.Cavalieri

2 Tipi Puntatori #include int nNumber; 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

3 #include 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; printf("\nContenuto di n = %d ",n); getchar(); } 1 byte n p byte byte n p byte > NULL Tipi Puntatori

4 int x=-57, y=25; int *p; main() { p=&y; x=*p; } x y 0040AB AB04 p 0040AB byte x y 0040AB AB04 p 0040AB AB04 4 byte NULL Tipi Puntatori

5 Tipi Puntatori e Struct struct elemento { char cognome[15]; unsigned short eta; } x, *p; p=&x *p corrisponde a x, allintero struct (*p).cognome corrisponde a x.cognome (*p).eta corrisponde a x.eta la parentesi è necessaria a causa della priorità loperatore -> può essere usato in alternativa (*p).cognome equivale a p->cognome (*p).eta equivale a p->eta

6 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)); flush(); printf("\n%s",p->cognome); printf("\n%s",x.cognome); printf("\n%u",p->eta); printf("\n%u",x.eta); getchar(); }

7 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

8 #include 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++; printf("\nContenuto di p=%p ",p); getchar(); }

9 Puntatori e Vettore Il nome della variabile vettore è lindirizzo 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));

10 Puntatori e Vettore #include #define N 10 int vettore[N], i; main() { for (i=0; i

11 Allocazione di Memoria in C #include 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.

12 Heap Stack Area Statica Area Programma Area Dati Allocazione di Memoria in C

13 #include int *pPointer; main() { pPointer = (int *) malloc(sizeof(int)); *pPointer = 25; free (pPointer); } Heap Stack NULL Area Programma Area Dati pPointer Area Statica Heap Stack 0050AB00 Area Programma Area Dati pPointer Area Statica AB00

14 Allocazione di Memoria in C Allocazione di un vettore #include 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(); } Heap Stack NULL Area Programma Area Dati v Area Statica 0 n Heap Stack 0050AB00 Area Programma Area Dati v Area Statica 10 n 10*sizeof(float) 0050AB00

15 Passaggio Parametri & #include 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 4 5 Record di Attivazione del main Return Address Link Dinamico a b 4 5 Record di Attivazione della Procedura scambia tmp 4 5 4

16 #include 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 & Return Address - x y Record di Attivazione del Main Return Address Link Dinamico a b 4 5 Record di Attivazione della Procedura Scambia tmp 4 5 4


Scaricare ppt "Puntatori e Heap in C Prof.Ing.S.Cavalieri. Tipi Puntatori #include int nNumber; int *pPointer; main() { nNumber = 15; pPointer = &nNumber; printf( "nNumber."

Presentazioni simili


Annunci Google