Fondamenti di Informatica II 10. Puntatori e gestione della memoria
|
|
- Arianna Colombo
- 5 anni fa
- Visualizzazioni
Transcript
1 Cosa sono i puntatori? Fondamenti di Informatica II 10. Puntatori e gestione della memoria I puntatori sono fondamentalmente delle variabili che non contengono un valore numerico o alfanumerico, ma un puntatore (ossia un indirizzo) alla locazione di memoria dove è memorizzato un certo valore (intero, reale o carattere) La definizione di una variabile puntatore avviene nello stesso modo con cui si definisce una variabile, eccetto che dobbiamo aggiungere un asterisco tra il tipo e l indentificatore del puntatore (ossia il nome della variabile puntatore) nel nome conviene indicare una p iniziale per ricordarci che è un puntatore Esempi: Corso di Laurea in Ingegneria Informatica A.A Semestre Corso (A-M) int* pone; short* pnum; Persona* pdip; double** ptot; // puntatore ad un int // puntatore ad uno short int // puntatore ad un tipo Persona (p.e. struct) // puntatore ad un puntatore a double Prof. Giovanni Pascoschi 2 Uso dei puntatori Esempio Esempio int* pone; int* ptwo; int num1, num2; pone = &num1; ptwo = &num2; L operatore & deve essere letto come l indirizzo di (Address-of) e restituisce l indirizzo di memoria della variabile e non la variabile. L operatore * deve essere letto come il contenuto della locazione di memoria puntata da a meno che non si trovi in una definizione di variabili puntatore del tipo 'int* pone. L operatore * prende il nome di operatore di dereference (deferenziamento). #include <iostream> using namespace std; int nnumber; int* ppointer; int main() { nnumber = 15; ppointer = &nnumber; // stampiamo il valore di nnumber cout<< "nnumber is equal to : <<nnumber<<endl; // ora, alteriamo nnumber per mezzo di ppointer *ppointer = 25; // stampiamo il nuovo valore di nnumber cout<<"nnumber is equal to: <<nnumber<<endl; return 0; 3 4
2 Puntatori : cosa succede nella memoria Cosa succede nella memoria #include <iostream> using namespace std; Le definizioni int n=7 e int* pnum, determinano la presenza di due locazioni di memoria allocate nell area dati int n=7; int* pnum; n 8A00 8A01 7 pnum = &n; *pnum = 13; return 0; pnum 8A02 8A03 Si suppone che il tipo int richieda 2 bytes di memoria ed assumendo che un puntatore occupi anch esso 2 bytes. la figura sono anche indicati gli indirizzi (in esadecimale) di ciascun byte. L indirizzo di n è per definizione l indirizzo del primo byte, cioè 8A00. L indirizzo di pnum è 8A Cosa succede nella memoria Esempio Le istruzioni: p=&n; *p=13; hanno il seguente effetto in memoria: #include <iostream> using namespace std; int x = - 5, y = 10; int* p; n pnum 8A00 8A01 8A A00 intmain( ){ p = &y; x = *p; return 0; // equivale all istruzione x = y 8A03 7 8
3 Esempio Esempio x 8A00 8A01-5 Le istruzioni: p = &y; x = *p; hanno il seguente effetto in memoria y 8A02 8A03 10 x 8A00 8A01 10 p 8A04 8A05 y 8A02 8A03 10 p 8A04 8A05 8A Puntatori : casi particolari Uso dei puntatori : compatibilità di tipo tra puntatori float* uno, due; float* uno, float* due; int Intero = 10; // dichiarazione due puntatori a float? NO // dichiarazione due puntatori a float? SI Un puntatore a un tipo T può contenere solo indirizzi di variabili di tipo T. Quindi, tipi di puntatori diversi sono incompatibili fra loro NO CASTING Esempi int x = 10; float * py; py = &x; // non si puo fare // const int* Puntatore = &Intero; //dichiarazione puntatore costante a intero? NO int x = 10,int * py; float* pz; int* const CostantePuntatore = &Intero; /* dichiarazione puntatore costante a intero? SI */ py = &x; pz = py; // non si puo fare // const int* const CostantePuntatoreACostante = &Intero; /* dichiarazione puntatore costante a costante di tipo intero */ void* PuntatoreGenerico /*dichiarazione puntatore generico puo puntare a un qualsiasi tipo */ MOTIVO:l informazione sul tipo del puntatore serve a dedurre il tipo dell oggetto puntato, che è indispensabile per effettuare correttamente il dereferenziamento 11 12
4 Esempio : operazioni sui puntatori Uso dei puntatori : operazioni con i puntatori #include <iostream> using namespace std; int a=4, b=15; int* pnum; pnum=&a; (*pnum)++; // incrementa a (parentesi necessarie) // pnum = &b; (*pnum)- -; // decrementa b cout<<a<<endl; // stampa 5 cout<<b<<endl; // stampa 14 return 0; Se P è un puntatore, ed n è un int (eventualmente anche negativo) cosa significa un espressione come : P+n??? Denota un altro puntatore, che punta n locazioni dopo la locazione puntata da P ( locazioni non byte!) Per locazione si intende l insieme di byte necessari a memorizzare una variabile di un certo tipo (provare a utilizzare p.e. sizeof(float) ) Se int richiede 2 (o 4) byte 1 locazione = 2 bytes Se float richiede 4 byte 1 locazione = 4 bytes Se double richiede 8 byte 1 locazione = 8 bytes Uso dei puntatori : operazioni con i puntatori Uso dei puntatori : inizializzazione dei puntatori Se n è negativo, la locazione denotata da P+n precede in realtà quella puntata da P Analogamente, se P e Q sono due puntatori allo stesso tipo T, l espressione P-Q denota il numero (intero) di celle che separano Q da P (eventualmente negativo se Q precede P) NOTA: operazioni tra variabili puntatori a tipi diversi (P puntatore a tipo int, Q puntatore a tipo float), come P+Q, sono illegali E buona regola non lasciare indefiniti i puntatori, per cui è bene inizializzarli subito dopo il momento in cui vengono dichiarati Esempio int *p; p=0; oppure p=null; NULL è una costante simbolica dichiarata anche nella libreria <iostream> 0 (zero) è l unico valore int che si può assegnare ad un puntatore 15 16
5 Vettori e puntatori Vettori e puntatori Un vettore (array) A è un insieme finito di N variabili dello stesso tipo, ognuna identificata da un indice Un vettore è organizzato come un puntatore costante, inizializzato a puntare un area di memoria opportunamente allocata al momento della dichiarazione Il nome del vettore A rappresenta in realtà l indirizzo iniziale dell area di memoria associata al vettore stesso Le seguenti notazioni sono equivalenti: int vett[10]; int* vett; L operatore [ ], applicato ad un nome di vettore, accede alla i-esima cella del vettore L operatore *, applicato ad un puntatore, accede alla variabile da esso puntata Poiché vett è il puntatore al primo elemento del vettore, vale la relazione: *vett = vett[0]; *(vett+1) = vett[1];.. *(vett+n-1) = vett[n-1]; Vettori e puntatori (aritmetica dei puntatori) Vettori e puntatori : esempio Le relazioni viste per i vettori: *A = A[0] *(A+i) = A[i] sono un applicazione dell aritmetica dei puntatori. A denota il puntatore costante alla cella di memoria che contiene la prima variabile del vettore (A+i) denota un altro puntatore che punta i locazioni dopo la locazione puntata da A *(A+i) denota il contenuto della locazione di memoria che si trova i locazioni dopo la locazione puntata da A int Array[ ] = { 1, 2, 3, 4, 5 ; int* pa = Array; // equivale a pa = &Array[0]; cout << pa[3] << endl; // pa[3] equivale a *(pa+3); pa[4] = 7; // equivalente a *(pa+4) = 7; 19 20
6 Puntatori e stringhe Array di stringhe Una stringa si puo anche definire in maniera analoga al C: char Array[ ] = "Una stringa"; char* pa = Array; cout << Array << " == " << pa << endl; // non è necessario usare *pa cout << Array[5] << " == " << pa[5] << endl; // stampa solo un elemento Un array di stringhe si puo dichiarare in diversi modi: string Array[10]; // array di stringhe (stile C++) char Array [10][20]; // matrice di caratteri char* parr[10]; // array di puntatori a carattere Puntatori a puntatore Puntatori a strutture Un puntatore puo puntare qualunque tipo anche un altro puntatore int A = 10; int* pa = &A; int** ppa = &pa; A = 50; // assegna ad A 50 *pa = 50; // assegna ad A 50 **ppa = 50; // assegna ad A 50 Un puntatore puo puntare qualunque tipo anche una struttura si usa l operatore -> Esempio: struct data { int giorno; string mese; int anno; ; data* pdata; data d; pdata = &d; (*pdata).giorno = 31;//per assegnare al campo giorno della struttura d il valore 31 opp. pdata-> giorno = 31; //per assegnare al campo giorno della struttura d il valore
7 Puntatori a funzione Puntatori a funzione : esempio Un puntatore puo puntare anche all indirizzo del nome di una funzione (in maniera analoga al nome di un array) Esempio: int funz(int); // dichiarazione della funzione int (*pf) (int); /* dichiarazione di pf puntatore a una funzione che restituisce un intero e utilizza un parametro intero*/ pf = &funz; // assegnazione di pf alla funzione funz float (*fp) (int x, int y); fp=&funz;... funz(x,y); // chiamata della funzione (*fp) (x,y); // metodo equivalente di chiamata della funzione float funz(int a, int b) { return a+b; Chiamata di funzione con passaggio di puntatore a funzione Array di Puntatori a funzione void (*funz2) ( ); funz1(funz2);... void funz1 (int (*f) ( )) { b = f(23); // b = 23 * 4 = 92 void funz2 (int a) { return 4 * a; Esempio: float (*fp[5]) (int a); /*array di 5 puntatori a funzione che restituiscono un float e che utilizzano un parametro intero*/ Con i puntatori a funzione si puo realizzare una tabella di puntatori a funzione e chiamare una funzione in base all'indice della tabella. Il codice puo "scegliere" quale funzione chiamare in base ad un valore numerico intero direttamente, senza usare un lungo elenco di if o un enorme switch (e' una possibilita' molto usata dai compilatori stessi) 27 28
8 Confronto reference(riferimenti) e puntatori Confronto reference(riferimenti) e puntatori int b = 5; float f = 0.1; int* pb = &b; int& bref = b; float& ff = f; // si crea un puntatore a intero che punta a b // si crea una variabile alias di b // si crea una variabile alias di f cout << b = " << b << endl; //stampa b = 5 cout << pb = " << pb << endl; // stampa indirizzo di b cout << "Assegnamento a pb..." << endl; *pb = 8; cout << b = " << b << endl; // stampa b = 8 cout << bref = " << bref << endl; // stampa bref = 8 cout << "Assegnamento a b..." << endl; b = 15; // oppure bref = 15; cout << b = " << b << endl; // stampa b = 15 cout << bref = " << bref << endl; // stampa bref = Confronto reference(riferimenti) e puntatori Funzioni con parametri reference(riferimenti) e puntatori 31 dopo l'inizializzazione, un riferimento non puo piu essere associato ad un nuovo oggetto: ogni assegnamento al riferimento si traduce in un assegnamento all'oggetto riferito (sono alias). Un riferimento puo` essere inizializzato anche tramite un puntatore: int a = 5; int* pint = &a; int& aref = *pint; // aref è un alias di a tramite pint 32 il passaggio di parametri per indirizzo puo avenire con due metodi : reference e puntatori // metodo per reference (riferimento) swap (num1, num2); void swap (int& a, int& b) { int comodo; comodo = a; a = b; b = comodo;
9 Funzioni con parametri reference(riferimenti) e puntatori Confronto reference e puntatori // metodo per puntatori swap (&num1, &num2); void swap (int* a, int* b) { int * comodo; *comodo = *a; *a = *b; *b = comodo; Vantaggio reference : nella chiamata di una funzione non c'e` differenza tra passaggio per valore o per riferimento e` possibile cambiare meccanismo senza dover modificare ne` il codice che chiama la funzione ne` il corpo della funzione stessa; il codice è piu leggibile Svantaggio reference : il meccanismo dei reference nasconde all'utente il fatto che si passa un indirizzo e non una copia, e cio` puo` creare grossi problemi in fase di debugging del programma Vantaggio puntatori: i puntatori consentono un maggior controllo sugli accessi (tramite la keyword const per impedire la modifica) e rendono esplicito il modo in cui il parametro viene passato (nel 2. modulo vedremo che in alcuni casi è piu conveniente usare i reference per rendere piu leggibile il codice) Principale utilizzo dei puntatori Gestione della memoria I puntatori sono utilizzati sostanzialmente per quattro scopi: 1. Realizzazione di strutture dati dinamiche (es. liste linkate); dopo 2. Realizzazione di funzioni con effetti laterali sui parametri attuali; 3. Ottimizzare il passaggio di parametri di grosse dimensioni; 4. Rendere possibile il passaggio di parametri di tipo funzione. A ciascun programma utente viene assegnata una porzione di memoria, che è automaticamente divisa in quattro porzioni: area del codice contiene il codice del programma area statica che contiene le variabili globali e statiche Il primo caso e` tipico di applicazioni per le quali non e` noto a priori la quantita` di dati che si andranno a manipolare. Dichiarando un array si pone un limite massimo al numero di oggetti di un certo tipo immediatamente disponibili. Utilizzando i puntatori invece e` possibile realizzare ad esempio una lista il cui numero massimo di elementi non e` definito a priori. (p.e. anagrafe comune bari) area heap disponibile per allocazioni dinamiche area stack contiene i record di attivazione delle funzioni (variabili locali e parametri)
10 Mappa della memoria Gestione della memoria Area Dati Area Programma Area Statica Heap Le dimensioni delle aree Programma e Statica sono fisse e sono decise in fase di compilazione. Tali dimensioni corrispondono al numero di righe in linguaggio macchina del programma e al numero di variabili globali/statiche definite in esso. Le altre due aree (Heap e Stack) non hanno dimensione fissa. Tale dimensione varia nel tempo a seconda dell utilizzo delle due aree. In particolare per quanto riguarda l area Heap, essa crescerà quando verranno allocate variabili dinamiche. La sua dimensione si ridurrà, invece, quando una o più variabili dinamiche verranno deallocate. Stack Area di stack Area Heap L'area di memoria Stack (pila) é caratterizzata dalla proprietà che l'ultimo dato che entra in memoria nella fase di scrittura è il primo ad uscire nella fase di lettura (LIFO = Last In First Out). Appena l esecuzione passa dal programma chiamante a una funzione viene allocato nello Stack un pacchetto di dati (record di attivazione). Il record di attivazione contiene l'indirizzo di rientro nel programma chiamante e la lista degli argomenti passati alla funzione. Esso viene accatastato sopra il pacchetto precedente (quello del programma chiamante) e poi automaticamente rimosso dalla memoria appena l'esecuzione della funzione é terminata. Nella memoria stack vengono memorizzate anche altre informazioni, e precisamente i dati relativi a tutte le variabili automatiche (cioè locali e non statiche) create dalla funzione. Il loro tempo di vita é legato all'esecuzione della funzione proprio perché, quando la funzione termina, l'intera area stack allocata viene rimossa. L area Heap è soggetta a regole di visibilità e tempo di vita completamente diverse da quelle che governano l'area Stack e precisamente: l'area heap non é allocata automaticamente, ma può essere allocata o rimossa solo su esplicita richiesta del programma (allocazione dinamica della memoria); l'area allocata non é identificata da un nome, ma é accessibile esclusivamente tramite la definizione di un puntatore; la sua visibilità é legata a quella della variabile puntatore che contiene il suo indirizzo; il suo tempo di vita coincide con l'intera durata del programma, a meno che non venga esplicitamente deallocata; se il puntatore va in una particolare condizione, denominata out of scope, l'area non é più accessibile, ma continua a occupare memoria inutilmente
11 Gestione dinamica della memoria (operatore new) Gestione dinamica della memoria (operatore new) Operatore new Per allocare in modo dinamico la memoria il C++ mette a disposizione l'operatore new. Questo operatore costruisce uno o più oggetti nell'area heap e ne restituisce l'indirizzo. In caso di errore (memoria non disponibile) restituisce NULL occorre controllare l allocazione dello spazio di memoria. La sintassi dell'operatore new è: new tipo[dimensione] (valore_iniziale) tipo é il tipo dell'oggetto (o degli oggetti) da creare; dimensione é il numero degli oggetti, che vengono sistemati nella memoria heap consecutivamente (come gli elementi di un array); se questo operando é omesso, viene costruito un solo oggetto; se é presente, l'indirizzo restituito da new punta al primo oggetto dell array; valore_iniziale é il valore con cui l'area allocata viene inizializzata (deve essere di un tipo coerente); se é omesso l'area non é inizializzata. N.B.: dei tre operandi dell'istruzione solo il primo è obbligatorio Operatore new (esempi) Operatore new (esempi) Esempi : int* pint = new int; si alloca un oggetto int nell'area heap e si usa il suo indirizzo per inizializzare il puntatore pint int* parr = new int [10]; // allocazione di un array si allocano 10 oggetti int nell'area heap e si usa l'indirizzo del primo oggetto per inizializzare il puntatore parr Esempi : struct persona { int a; string b; ; persona* p_pers; p_pers = new persona[100] + 20; // allocazione di una tabella int* pmat = new int[20][20]; // allocazione di una matrice si alloca una matrice 20x20 di interi nell area heap e si usa l indirizzo del primo oggetto [0][0] per inizializzare il puntatore pmat In tal caso si definisce la struttura persona e si dichiara il puntatore p_pers a questa struttura al puntatore p_pers si assegna l'indirizzo del ventesimo dei cento oggetti di tipo persona, allocati nell'area heap 43 44
12 Gestione dinamica della memoria (operatore delete) Gestione della memoria Per deallocare la memoria dell'area heap in C++ mette a disposizione l'operatore delete Questo operatore non restituisce alcun valore Se l'operando punta a un'area in cui sono stati allocati più oggetti, delete va specificato con una coppia di parentesi quadre (senza la dimensione, che il C++ é in grado di riconoscere automaticamente). La sintassi dell'operatore delete è: delete nome_punt float* parr = new float [100] ; delete [ ] parr; // alloca 100 oggetti float // libera tutta la memoria allocata l'operatore delete non cancella la variabile nome_punt, né altera il suo contenuto: l'unico effetto é di liberare la memoria puntata rendendola disponibile per ulteriori allocazioni int* punt = new int; int a; punt = &a; // alloca un int nell'area heap /*assegna a punt un indirizzo dell'area stack (out of scope), per cui l'oggetto int dell'area heap non é più raggiungibile e deallocabile*/ Allocazione dinamica della memoria Gestione dell overflow di memoria La memoria heap non è infinita se ci si dimentica di usare l operatore delete e si ripete più volte l uso dell operatore new, si può avere out-ofmemory E necessario non lasciare che ciò avvenga deallocando le aree di memoria prima che si perdano i puntatori e diventino inaccessibili (operazione di garbage collection) Per gestire / trappare situazioni di errore di allocazione dinamica (p.e. mancanza di spazio nella memoria heap) set_new_handler( ) funzione che serve a gestire gli errori dell operatore new, la quale ha come parametro un puntatore a funzione. Pertanto quando si allocano degli oggetti con l operatore new, è necessario verificare che il puntatore restituito non è un puntatore nullo (NULL)
13 49 Esempio : Gestione dell overflow di memoria #include <iostream> #include <new> using namespace std; void mem_fault( ); set_new_handler (mem_fault); long dim; int* pmem; int blocco; cout << Quanta memoria? ; cin>> dim; for (blocco = 1; ; blocco++) { pmem = new int(dim); cout<< Alloc. blocco: <<blocco<<endl; void mem_fault( ) { cout<< Fault memoria << endl; exit(1); 50 Riepilogo della lezione Puntatori e gestione della memoria Puntatori Corretto uso dei puntatori (aritmetica dei puntatori) Confronto tra reference e puntatori Gestione della memoria Allocazione dinamica della memoria in C++ Gestione overflow memoria in C++ Fine della lezione Domande? 51
Laboratorio di Informatica
Cosa sono i puntatori? I puntatori sono fondamentalmente delle variabili che non contengono un valore numerico o alfanumerico, ma un puntatore (ossia un indirizzo) alla locazione di memoria dove è memorizzato
DettagliFondamenti di Informatica
Cosa sono i puntatori? I puntatori sono fondamentalmente delle variabili che non contengono un valore numerico o alfanumerico, ma un puntatore (ossia un indirizzo) alla locazione di memoria dove è memorizzato
DettagliFondamenti di Informatica
Strutture di dati Fondamenti di Informatica 11. Linguaggio C - Strutture / Tabelle / Puntatori Strutture /Tabelle Corso di Laurea in Ingegneria Informatica e dell Automazione A.A. 2012-2013 2 Semestre
DettagliAllocazione dinamica della memoria
Allocazione dinamica della memoria Memoria stack ed heap (1) L'area di memoria stack é quella in cui viene allocato un pacchetto di dati non appena l'esecuzione passa dal programma chiamante a una funzione.
DettagliCorso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica
Corso di Fondamenti di Informatica Puntatori e Allocazione Dinamica I puntatori (Richiamo) Il C++ prevede puntatori a dati di qualsiasi natura, semplici o strutturati e puntatori a funzione. In particolare
DettagliIngegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo
Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo In C++ è possibile distinguere due aree distinte di memoria: memoria stack e memoria heap E
DettagliCorso di Fondamenti di Informatica
Corso di Fondamenti di Informatica Il tipo puntatore; l allocazione dinamica della memoria Claudio De Stefano - Corso di Fondamenti di Informatica 1 puntatori una variabile di tipo puntatore al tipo x
DettagliAllocazione dinamica della memoria
Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori
DettagliOgni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.
Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono
DettagliProf.Ing.S.Cavalieri Puntatori e Heap in Linguaggio C. Puntatori e Heap
Puntatori e Heap 1.Cosa Sono i Puntatori? I puntatori sono fondamentalmente delle variabili, come quelle intere, reali e carattere. Tuttavia, l unica differenza consiste nel fatto che essi non contengono
DettagliParte 3. Puntatori. [S. Dalí The temptation of St. Anthony, 1946] - AA. 2015/16 3.1
Parte 3 Puntatori [S. Dalí The temptation of St. Anthony, 1946] 3.1 3.2 Puntatori Approfondimento rispetto alla trattazione vista nel corso precedente Finora come avete utilizzato i puntatori? Principalmente
DettagliFondamenti di Informatica
Programmazione modulare (top-down) Fondamenti di Informatica 15. Funzioni in C++ (parte 1) Problemi complessi Conviene suddividere il programma in sottoprogrammi piu semplici mediante la metodologia di
DettagliIntroduzione ai puntatori
Introduzione ai puntatori Algoritmicamente November 19, 2009 http://algoritmicamente.wordpress.com/ 1 Concetti fondamentali Nei linguaggi quali C, C++, il concetto e l'uso dei puntatori è estremamente
DettagliFunzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide,
DettagliVariabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free
Variabili dinamiche Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free 1 Tipi di variabili in C In C è possibile classificare le variabili in
DettagliFondamenti di Informatica T. Linguaggio C: i puntatori
Linguaggio C: i puntatori Il puntatore E` un tipo di dato, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore è un insieme
DettagliCorso di Programmazione I
Corso di Programmazione I I puntatori in C e C++ I puntatori in C Il C prevede puntatori a funzione e puntatori a dati di qualsiasi natura, semplici o strutturati. In particolare il puntatore viene utilizzato
DettagliUnità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
DettagliIl linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
DettagliLaboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011
Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011 Raffaele Nicolussi FUB - Fondazione Ugo Bordoni Via del Policlinico, 147 00161 Roma I puntatori Variabili e parametri Parametri formali
DettagliPuntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori
Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per
DettagliPuntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori
Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per
DettagliLinguaggio C: puntatori
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica A - GES Prof. Plebani A.A. 2006/2007 Linguaggio C: puntatori La presente dispensa e da utilizzarsi ai soli fini didattici previa
Dettagli! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente
! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente!!la loro esistenza deve essere prevista e dichiarata a priori! Questo può rappresentare un problema soprattutto per variabili
DettagliArray. Unità 7. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER
Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico
DettagliPer quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente la loro esistenza deve essere prevista e dichiarata a priori Questo può rappresentare un problema
DettagliGestione dinamica della memoria
Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.
DettagliAllocazione dinamica della memoria
Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
DettagliElementi di Informatica
Corso di Laurea triennale in Ingegneria Chimica in condivisione con Corso di Laurea triennale in Ingegneria Navale e Scienze dei Materiali Elementi di Informatica A.A. 2016/17 prof. Mario Barbareschi Puntatori
DettagliIl puntatore. Il puntatore
Il puntatore È un tipo scalare, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Il dominio di una variabile di tipo puntatore è un insieme di indirizzi: Il valore di una
DettagliVerso i puntatori: Cosa è una variabile?
Verso i puntatori: Cosa è una variabile? Quando si dichiara una variabile, ad es. int a; si rende noto il nome e il tipo della variabile. Il compilatore alloca l opportuno numero di byte di memoria per
DettagliStrutture Dati Dinamiche
Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti
DettagliArgomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili
Linguaggio C Argomenti Avanzati! I puntatori! Stack! Visibilità delle Variabili 2 ! Il C consente di associare ai tipi di dati nomi definiti dal programmatore, mediante la parola chiave typedef! Dal punto
DettagliFondamenti di Informatica
Strutture dati complesse Esempi di strutture dati complesse analizzate in questa lezione: Fondamenti di Informatica 21. Strutture di dati complesse in C++ Array di puntatori Pila (Stack) Coda (queue) Liste
DettagliAllocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()
Allocazione Statica Finora abbiamo visto che le variabili sono sempre definite staticamente. Questo è un limite perché la loro esistenza deve essere prevista e dichiarata a priori. In particolare per variabili
DettagliQuando è necessario elaborare una certa quantità di dati omogenei si possono usare variabili indicizzate: int a0, a1, a2;
Array Quando è necessario elaborare una certa quantità di dati omogenei si possono usare variabili indicizzate: int a0, a1, a2; Il C supporta questo uso attraverso il tipo di dati array (o vettore): int
DettagliAllocazione statica della memoria
2015 - Roberta Gerboni 1 2 Allocazione statica della memoria Cosa succede nella memoria del computer quando il un programma vengono dichiarate delle variabili? memoria Ad esempio: int main() 57 { int x=
DettagliParametri Formali di una Funzione e Record di Attivazione
Parametri Formali di una Funzione e Attivazione Un record di attivazione rappresenta il mondo di una funzione, e contiene tutto ciò che ne caratterizza l esistenza, tra cui ad esempio: le variabili locali
DettagliPassaggio parametri puntatore
Passaggio parametri puntatore Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it
DettagliCorso di Informatica A.A
Corso di Informatica A.A. 2009-2010 Lezione 11 Corso di Informatica 2009-2010 Lezione 11 1 Utilizzo dei puntatori Funzioni Perche i Puntatori? I puntatori hanno tre importanti applicazioni: 1. Passaggio
DettagliCorso di Informatica A.A
Corso di Informatica A.A. 2009-2010 Lezione 10 Lezione 10 1 Inside C : Puntatori Puntatori Referenziazione e Dereferenziazione Pointers: Puntatori Le variabili finora incontrate sono caratterizzate da
DettagliIntroduzione al C. Unità 6 Puntatori. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 6 Puntatori S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi Sommario
DettagliLezione 12: Allocazione Dinamica della Memoria
Lezione 12: Allocazione Dinamica della Memoria Laboratorio di Elementi di Architettura e Sistemi Operativi 17 Aprile 2013 Puntatori e vettori Puntatori ed indirizzi Semplificando, la memoria di un computer
DettagliLinguaggio C: PUNTATORI
Linguaggio C: PUNTATORI I puntatori sono una delle più importanti caratteristiche del linguaggio C. Permettono di lavorare a basso livello, mantenendo flessibilità e praticità. Il C utilizza molto i puntatori
Dettagli&v restituisce l indirizzo della zona di memoria allocata per v.
Puntatori Sia v una variabile di tipo T. Al momento della creazione della variabile v il sistema alloca memoria sufficiente a contenere i valori appartenenti al tipo T. &v restituisce l indirizzo della
DettagliLaboratorio di Informatica
Strutture di dati Laboratorio di Informatica 5. Strutture / Array di oggetti / Pila&Coda in C++ Una struttura è un insieme finito di variabili (dette campi) non necessariamente dello stesso tipo, ognuna
DettagliProgrammazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Tipi Strutturati Concetti Avanzati versione 2.5 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca
DettagliUniversità degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria
di Cassino e del Lazio Meridionale Corso di Informatica Allocazione dinamica di memoria Anno Accademico 2015/2016 Francesco Tortorella Allocazione dinamica di memoria Finora abbiamo considerato variabili
DettagliL AMBIENTE CODE BLOCKS E L IO
L AMBIENTE CODE BLOCKS E L IO Il primo programma in C++ #include using namespace std; main() { cout
DettagliOperatore di indirizzo
Operatore di indirizzo L operatore unario di indirizzo & restituisce l indirizzo della locazione di memoria dell operando Il valore restituito non va usato come l- value (in quanto l indirizzo di memoria
DettagliL'Allocazione Dinamica della Memoria nel linguaggio C
L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego riochierego@libero.it http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria
DettagliIntroduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2016
DettagliAllocazione Dinamica della Memoria
Allocazione Dinamica della Memoria Elisa Marengo Università degli Studi di Torino Dipartimento di Informatica Elisa Marengo (UNITO) Allocazione Dinamica della Memoria 1 / 10 Scelta delle variabili Quando
DettagliIntroduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017
Dettagli20. Gestione della memoria. Andrea Marongiu Paolo Valente
20. Gestione della memoria Andrea Marongiu (andrea.marongiu@unimore.it) Paolo Valente Classi di memorizzazione Stiamo per vedere la classificazione di un oggetto in funzione del suo tempo di vita In particolare,
DettagliInformatica (A-K) 14. Linguaggio C -4
Strutture Dati in C Le strutture dati sono entità che permettono di memorizzare dati in modo organizzato e funzionale a particolari esigenze Informatica (A-K) 14. Linguaggio C -4 Strutture Dati tipiche
DettagliStrutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.
Consideriamo l esercizio assegnato la scorsa lezione per rappresentare il libretto di uno studente. Per memorizzare i dati si sono utilizzati tre array: char* nomiesami[max ESAMI] Array dei nomi degli
DettagliPuntatori in C Lucidi della Pof.ssa Pazienza
Puntatori in C Lucidi della Pof.ssa Pazienza http://www.uniroma2.it/didattica/foi2/ Puntatori L operatore di indirizzo & Indirizzi, puntatori Aritmetica dei puntatori L operatore di dereferenziazione *
DettagliLaboratorio di Informatica
-- Conversione di tipo in C (V) -- Laboratorio di Informatica Ingegneria Meccanica Lezione 7, 22 novembre 2007 versione 24 novembre 2007 Renato Menicocci
DettagliCostanti e Variabili
Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli
DettagliPuntatori. Fondamenti di Programmazione
Puntatori Fondamenti di Programmazione Funzioni utili stdio.h c = getchar(); restituisce un carattere letto da tastiera. Equivale a: scanf( %c, &c); putchar(c); scrive un carattere sullo schermo. Equivale
DettagliIl C nel C++: Funzioni
Il C nel C++: Funzioni Funzioni (1) il concetto -> spezzare il programma in parti (procedure) una funzione è un parte di programma dotata di un nome che può essere richiamata in altri punti del programma
DettagliFunzioni (1) Il C nel C++: Funzioni. Funzione (2) Vantaggi delle Funzioni. Localizzazione della funzionalità correggibilità manutenibilità
Funzioni (1) Il C nel C++: Funzioni il concetto -> spezzare il programma in parti (procedure) una funzione è un parte di programma dotata di un nome che può essere richiamata in altri punti del programma
DettagliI PUNTATORI PARTE I. Manuale linguaggio C
I PUNTATORI PARTE I Manuale linguaggio C I puntatori Una variabile è un'area di memoria alla quale è associato un nome simbolico, scelto dal programmatore. Tale area di memoria è grande quanto basta per
DettagliAllocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica
Allocazione dinamica della memoria Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Allocazione della memoria Il termine allocazione viene utilizzato per indicare l assegnazione di un blocco
DettagliC++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW
C++ funzioni Alberto Ferrari http://en.cppreference.com FUNZIONI le funzioni caratterizzate da nome, parametri (numero, ordine e tipo) e tipo di ritorno le funzioni hanno un prototipo il prototipo non
DettagliListe concatenate e allocazione dinamica
Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2017/2018 Calendario delle lezioni Ogni lezione consta di una spiegazione assistita da slide,
DettagliFunzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
Dettaglipassaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in
I Parametri di tipo vettore I Il meccanismo del passaggio per valore di un indirizzo consente il passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad
DettagliFondamenti di Informatica II 3. Funzioni in C++ (parte 1)
Introduzione alle funzioni in C++ Fondamenti di Informatica II 3. Funzioni in C++ (parte 1) Corso di Laurea in Ingegneria Informatica A.A. 2008-2009 2 Semestre Corso (A-M) int main() int n, fattoriale=1;
DettagliLab 11 Allocazione dinamica della memoria
Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni Lab 11 Allocazione dinamica della memoria Lab17 1 STACK L'area di memoria stack é quella in cui viene allocato un
DettagliArray. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
DettagliPUNTATORI. Ivan Lanese
PUNTATORI Ivan Lanese Argomenti Puntatori Liste Puntatori Un puntatore è un tipo di dato che contiene l'indirizzo di memoria di un altro tipo di dato In c+o i puntatori sono tipati: avremo puntatori a
DettagliProgrammazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013
Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario Array Array monodimensionali Array bidimensionali Esercizi 16/01/2013 2 ARRAY Gli array sono oggetti utilizzati in Java per memorizzare
DettagliC: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
DettagliLa programmazione nel linguaggio C. Liste
Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 28 3) sequenza di caratteri ( x r f ) sequenza di
DettagliLe funzioni: la dichiarazione
Funzioni I Parte Indice Le funzioni: dichiarazione, definizione e chiamata Le regole di visibilità (scope) Il passaggio degli argomenti per valore e riferimento La funzione main() Le funzioni: la dichiarazione
DettagliLe funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità
Funzioni I Parte Indice Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità Le funzioni: la dichiarazione
DettagliFondamenti di Informatica 12. Linguaggio C -4
Strutture Dati in C Le strutture dati sono entità che permettono di memorizzare dati in modo organizzato e funzionale a particolari esigenze Fondamenti di Informatica 12. Linguaggio C -4 Strutture Dati
DettagliPuntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
DettagliInformatica (A-K) 12. Linguaggio C -3
Introduzione alle funzioni in C Informatica (A-K) 12. Linguaggio C -3 int main() int i,n, fattoriale=1; printf( Inserire Numero: ); scanf( %d, &n); for (i =2; i
DettagliDati due punti sul piano calcolare la loro distanza
Introduzione al C Primo esempio in C Dati due punti sul piano calcolare la loro distanza Soluzione: la distanza fra due punti si calcola secondo il teorema di Pitagora, con la formula: y Distanza = (lato12
DettagliIl linguaggio C funzioni e puntatori
Salvatore Cuomo Il linguaggio C funzioni e puntatori Lezione n. 8 Parole chiave: Linguaggio C, procedure, funzioni. Corso di Laurea: Informatica Insegnamento: Programmazione II, modulo di Laboratorio Email
DettagliLa gestione della memoria dinamica Heap
Laboratorio di Algoritmi e Strutture Dati La gestione della memoria dinamica Heap Prof. Luigi Lamberti 2005 Cenni sui Processi Un Programma è un insieme di Istruzioni memorizzato in un file con le costanti
DettagliLe funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità
Funzioni I Parte Indice Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità Le funzioni Tutti i linguaggi
DettagliCosa è una variabile?
Cosa è una variabile? Quando si dichiara una variabile, ad es. int a; si rende noto il nome e il tipo della variabile. Il compilatore alloca l opportuno numero di byte di memoria per contenere il valore
DettagliProgrammazione I Prova scritta - 10 gennaio h20min
Programmazione I Prova scritta - 10 gennaio 2019-1h20min NOTA: Nei programmi si trascuri ogni problema legato al tipo ed al valore di ritorno della funzione main, inoltre si sottintenda la presenza delle
DettagliIntroduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
DettagliPuntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi
Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto
DettagliLinguaggio C: le funzioni. Visibilità variabili e passaggio parametri
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri
DettagliUniversità degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella
Corso di Informatica Puntatori Anno Accademico 2010/2011 Francesco Tortorella Variabili, registri ed indirizzi Abbiamo visto che la definizione di una variabile implica l allocazione (da parte del compilatore)
DettagliIntroduzione al C++ (continua)
Introduzione al C++ (continua) I puntatori Un puntatore è una variabile che contiene un indirizzo di memoria pi_greco 3.141592 pi_greco_ptr indirizzo di 3.141592 & DEREFERENZIAZIONE RIFERIMENTO * se x
DettagliAllocazione dinamica della memoria
Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Tipi di memoria dati Nella macchina astratta C esistono tre tipi di memoria per allocare
DettagliINTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica
Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione
DettagliINTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma
Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione
Dettagli