Puntatori e gestione dinamica della memoria

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Puntatori e gestione dinamica della RAM
Simulazione del calcolo di due numeri binari
Preincremento e PostIncremento in C++
Puntatori in C e C++.
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
Le funzioni.
Fondamenti di Informatica Prof. Cantone
Anno accademico Array e puntatori in C.
Algoritmi in C++ (1) da completare
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Corso di Fondamenti di programmazione a.a.2009/2010
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 06/03/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione III Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Lezione 5. Ricapitolando…. Sistemi P2P puri Sistemi UniformiSistemi Non uniformi Abbiamo detto abbastanza KoordeNeighbor of Neighbor routing (NON)
Ricapitolando…. Sistemi P2P puri Sistemi UniformiSistemi Non uniformi Abbiamo detto abbastanza KoordeNeighbor of Neighbor routing (NON)
Puntatori - Cenni Nicola Fanizzi Corso di Programmazione C.d.L. in Informatica DIB - Università degli Studi di Bari.
Lab. Calc. AA 2005/061 puntatori. Lab. Calc. AA 2005/062 Attributi di un oggetto nome o identificatore; tipo o classe; valore o valori; indirizzo;
1 laboratorio di calcolo II AA 2003/04 terza settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 seconda settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Algoritmi e Programmazione Avanzata
AN FI Array Array in Java. AN FI Array Dichiarazione di array in Java [ ]; //oppure u [] ; int a[]; int[] a; u La dimensione non è specificata.
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
Fondamenti di informatica Linguaggio C Main Program: Architettura di un PC Diagrammi di flusso Linguaggio C.
TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.
Diagramma degli stati che descrive il comportamento della rete.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 6 (Deitel) I vettori Sommario Introduzione Vettori Dichiarazione di vettori 6.4.
Programmazione di Calcolatori
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
void binario(int n); …………………
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
Passaggio di parametri per indirizzo
Matrici: un’implementazione parametrica in C++
Ricerca sequenziale in un array di interi
Corso di Informatica 2 a.a. 2003/04 Lezione 6
Strutture dati elementari
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Il linguaggio C Puntatori e dintorni.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Informatica A.A. 2009/2010 Parte 4 Dai diagrammi di flusso alla programmazione strutturata: le istruzioni if, for, while, … Corso A: Prof. Stefano Berardi.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Ereditarietà in C++
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Vettori (a una dimensione)
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
Stringhe Una stringa è un vettore di char con un carattere costante \0 che indica la fine della stringa il terminatore rende differenti gli array di char.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Passaggio di parametri per indirizzo
Transcript della presentazione:

Puntatori e gestione dinamica della memoria Corso di Informatica 2 a.a. 2003/04 Lezione 4 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Vantaggi nell’uso dei vettori Sono legati all’accesso diretto agli elementi utilizzando gli indici. indirizzo v[i] = b + i  d d = dimensione elemento  v v[i] b = indirizzo base i = indice (spiazzamento) Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Indirizzamento della RAM 000 001 1 010 1 011 1 23 100 101 1 1 110 1 111 1 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Problemi nell’uso dei vettori La dimensione di un vettore deve essere fissata al momento della compilazione: int v[100]; // non int v[dim]; con dim variabile L’inserimento di un nuovo valore comporta lo slittamento di tutti quelli alla sua destra: for (j = indice_prox_loc_libera; j > i; j--) v[j] = v[j-1]; v[i] = nuovo_valore; Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

<tipo>* <variabile>; I puntatori Un puntatore è una variabile il cui dominio di definizione sono gli indirizzi di memoria <tipo>* <variabile>; int* p; // puntatore a intero int *p, *q; // breve per int* p; int* q; Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Dereferenziazione (*) L’operatore di dereferenziazione (* <puntatore>) legge/scrive alla locazione di memoria il cui indirizzo è il valore del suo operando p 025fe16 025fe16 2983 *p == 2983 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Operatore indirizzo (&) Se x è una variabile, &x è l’indirizzo a cui sono memorizzati i suoi valori x 025fe16 2983 &x == 025fe16 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Esempio // esempio di dereferenziazione e // uso dell’oporatore & #include <iostream.h> int main() { int x = 7; int *p1, *p2; // oppure int* p; int* q; p1 = &x; p2 = p1; cout << “*p2 = “ << *p2 << endl; // stampa il valore di x cioe’ 7 cout << “p2 = “ << p2 << endl; // stampa il valore di p2 cioe’ // l’indirizzo di x } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Condivisione (sharing) I puntatori possono condividere l’area di memoria cui puntano: int *p, *q; int n = 44; p = q = &n; p q n 44 Ogni modifica del valore di n che avvenga per assegnazione su *p si riflette su n e su *q. Questa caratteristica viene sfruttata per ottonere effetti collaterali sui valori dei parametri attauli, passandoli cioè per indirizzo. Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

<tipo>& <nome rif> = <nome var> Riferimenti In C++ si può avere sharing anche senza i puntatori, usando riferimenti, ovvero sinonimi (alias): <tipo>& <nome rif> = <nome var> int main () { int n = 44; int& rn = n; // rn è sinonimo di n n--; cout << rn << endl; // stampa 43 } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Vettori e puntatori in C++ In C++ un vettore è una costante di tipo puntatore: int v[100]; int* p; p = v; // il valore di p è l’ind. di base di v // ossia p == &v[0] Si può usare la notazione con gli indici per i puntatori che si riferiscono a vettori: p[i] … // equivale a v[i] Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Aritmetica dei puntatori (1) Ad ogni tipo di dato corrisponde la dimensione in byte della memoria necessaria per contenere i suoi valori: int sizeof(<tipo>) // C: ritorna la dim. I puntatori sono tipati: ciò è essenziale per sapere cosa leggere/scrivere alle locazioni di memoria cui puntano Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Aritmetica dei puntatori (2) In C++ si possono sommare (o sottrarre) interi a puntatori: int *p, *q; q = p + 10; // il valore di q == // valore di p + 10*sizeof(int) Quindi, se p punta ad un vettore v: p+i == &v[i] // ovvero *(p+i) == v[i] == p[i] Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Aritmetica dei puntatori (3) incremento e decremento: int *p; p = &n; p++; /* p punta a &n + sizeof(int) */ somma e sottrazione di un intero: int n, m, *p; p = &n; p = p + m; /* p punta a &n + m * sizeof(int) */ differenze tra puntatori: int n, a, b, *p, *q; p = &a, q = &b; n = p - q; /* n è il numero degli interi allocabili tra gli indirizzi di a e di b */ confronto tra puntatori: int n, m, *p; p = &n; q = &m; if (p < q) … /* eseguito se l’indirizzo di n è minore di quello di m */ Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Esempio void Inverti (int v[]; int lun); // inverte l’ordine degli el. di v[lun] { int t, *p, *q; for(p = v, q = p + (lun-1); p < q; p++, q--) { t = *p; *p = *q; *q = t; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di parametri per valore void f(int n){ n++; } int a = 0; f(a); cout << a; a Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di parametri per valore void f(int n){ n++; } int a = 0; f(a); cout << a; a n Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di parametri per valore void f(int n){ n++; } int a = 0; f(a); cout << a; a 1 n Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di parametri per valore void f(int n){ n++; } int a = 0; f(a); cout << a; a Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per riferimento void f(int& n) { n++; } int a = 0; f(a) cout << a; a Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per riferimento void f(int& n) { n++; } int a = 0; f(a) cout << a; a n Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per riferimento void f(int& n) { n++; } int a = 0; f(a) cout << a; 1 a n Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per riferimento void f(int& n) { n++; } int a = 0; f(a) cout << a; 1 a Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per puntatore void f(int* pn) { *(pn++); } int a = 0; f(&a) cout << a; a Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per puntatore void f(int* pn) { *(pn++); } int a = 0; f(&a) cout << a; a pn Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per puntatore void f(int* pn) { *(pn++); } int a = 0; f(&a) cout << a; 1 a pn Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Passaggio di par. per puntatore void f(int* pn) { *(pn++); } int a = 0; f(&a) cout << a; 1 a Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica Allocazione = destinazione di una certa quantità di memoria per contenere valori di un dato tipo Tutte le variabili di un programma sono allocate quando sono in uso (puntatori inclusi) E’ possibile allocare memoria durante l’esecuzione del programma in una area specifica detta “memoria dinamica” Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica: new int *p; p = new int; *p = 2983; p 025fe16 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica: new int *p; p = new int; *p = 2983; p 025fe16 025fe16 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica: new int *p; p = new int; *p = 2983; p 025fe16 025fe16 2983 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica: new float* p; *p = 3.14159; // ERRORE: p non è allocato float x = 3.14159; float *p = &x // OK: p usa l’allocazione di x float* p = new float; *p = 3.14159; // OK: p è allocato Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica in C Tipo *p; p = (Tipo*) malloc (sizeof(Tipo)); Alloca una struttura dati la cui dimensione in byte dipende da Tipo ed è calcolata da sizeof; in caso di successo assegna il tipo Tipo* all’indirizzo di inizio del blocco, ed il valore è salvato in p. Se non c’è più memoria disponibile, malloc ritorna NULL, che sarà allora il valore di p. Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica di un vettore Per allocare dinamicamente un vettore occorre conoscere: Il tipo dei suoi elementi; il numero di questi elementi (che tuttavia potrà essere noto anche solo al momento dell’esecuzione). int *v, lun; v = new int[lun]; // in C++ v = (int*) malloc (sizeof(int)*lun); // in C Alloca un vettore di lun interi, dove però lun è una variabile. Comunque, una volta allocato, v punterà ad un vettore la cui lunghezza non è più modificabile. Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Le stringhe Le stringhe sono vettori di caratteri, contenenti un terminatore: ‘\0’ char s[] = “Salve mondo”; char s[MAXLUN]; char *s = “Salve mondo”; Esiste un tipo stringa, definito: typedef char* String; Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione di stringhe E’ opportuno costruire una funzione di allocazione (allocatore o generatore) per ogni struttura dati che si implementa: String StrAlloc(int len) { String *s; s = new String[len + 1]; // len + 1 per far posto a ‘\0’ return s; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Operazioni sulle stringhe (1) int strlen (String s) { int n = 0; while (*s++ != ‘\0’) n++; return n; } int strcpy (String dest; String source) { while((*dest++ = *source++)!= ‘\0’); Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Operazione sulle stringhe (2) String LeggiStringa (void) { char buffer[MAXLUN]; String s; gets(buffer); s = Stralloc(strlen(buffer)); strcpy(s, buffer); return s; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

I record Un record è una tupla di valori di tipi possibilmente diversi acceduti attraverso etichette: struct <nome struttura> { <tipo1> <etichetta campo1>; ... <tipok> <etichetta campok>; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Allocazione dinamica di record (strutture) Come per i tipi di base e per i vettori, si possono allocare record: typedef struct Record {int field; …} *MyRecord; MyRecord = new Record; Data la frequenza dell’uso di puntatori a record, il C++ usa la sintassi: p->field invece di (*p).field Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Un modo per definire il tipo vettore (1) Un buon metodo per definire un vettore da allocare dinamicamente è usare un record con un campo lunghezza: typedef VecRec* Vettore; typedef struct vecrec { int lun; int* vec; } VecRec; Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Un modo per definire il tipo vettore (2)  n – elementi del vettore Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Un modo per definire il tipo vettore (3) Vettore VettAlloc (int lunghezza) { Vettore v; v = new VecRec; v->lun = lunghezza; v->vec = int[lunghezza]; return v; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Un esempio più complesso: matrici (1) typedef MatrRec* Matrice; typedef struct matrmec { int righe, colonne; int **vecrighe; } MatrRec; n m  m n Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Un esempio più complesso: matrici (2) Matrice NuovaMatrice (int r, int c) { Matrice m; int i; m = new MatrRec; m->righe = r; m->colonne = c; m->vecrighe = new int*[r]; for (i = 0; i < r; i++) m->vecrighe[i] = new int[c]; return m; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Deallocazione La memoria dinamica allocata può essere recuperata usando la funzione delete: delete <puntatore> Per deallocare un vettore non occorre ricordarne la dimensione: delete [] <nome vettore> Per deallocare una struttura complessa come matrice occorrono tante chiamate di delete quante sono state quelle di new Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4

Deallocazione di Matrice void DeallocaMatrice (Matrice m) { int i; for(i = 0; i < m->righe; i++) delete [] m->vecrighe[i]; delete [] m->vecrighe; delete m; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 4