Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a. 2003-2004 – 3° ciclo.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Puntatori Linguaggio C.
Puntatori in C e C++.
Costruttori e Distruttori
PUNTATORI Introduzione
Universita di Camerino
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Introduzione al linguaggio C
Anno accademico Le classi di memorizzazione.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
Funzioni definite dall’utente
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Approfondimento delle classi
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Fondamenti di Informatica A - Massimo Bertozzi TIPI DI DATO IN C++ What's in a name? That which we call a rose By any other name would smell as sweet.
Le funzioni a tempo di esecuzione
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Tipi di dati elementari
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
Introduzione al linguaggio assembly del microprocessore a parte
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
I nomi in Java F. Bombi 18 novembre novembre 2003.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Puntatori e Stringhe.
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.
1. 2 Variabili statiche e dinamiche Un programma è un processo in esecuzione a cui il sistema operativo assegna una certa zona di memoria. Tale zona può.
1 novembre I nomi in Java F. Bombi 1 novembre 2002.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
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.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Il linguaggio C Puntatori e dintorni.
Copyright © Istituto Italiano Edizioni Atlas
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.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Lucidi della Pof.ssa Pazienza
Transcript della presentazione:

Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo

Memoria dinamica La memoria dinamica è la memoria gestita dinamicamente a run-time dal sistema operativo e dal programma (stack ed heap) E’ possibile (per un programma) allocare aree di memoria dinamicamente durante l’esecuzione ed accedere ad esse mediante puntatori. Gli oggetti così ottenuti sono detti dinamici ed allocati nella memoria libera.

Memoria stack 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. Questo “pacchetto” contiene: - l’indirizzo di rientro nel programma chiamante - la lista degli argomenti passati alla funzione - il valore di ritorno della funzione e viene “impilato” sopra il pacchetto precedente (quello del progr. chiamante) e poi automaticamente rimosso dalla memoria appena l’esecuzione della funzione é terminata.

Memoria stack Nella memoria stack vengono sistemati anche 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.

Memoria heap Esiste un’altra area di memoria che il programma può utilizzare. Questa area, detta heap, è soggetta a regole completamente diverse da quelle che governano l’area stack. L’area heap non é allocata automaticamente, ma solo su esplicita richiesta del programma (allocazione dinamica della memoria) L’area allocata non é identificata da un nome, ma é accessibile solo tramite dereferenziazione di un puntatore

Memoria heap 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 out of scope, l’area non é più accessibile, ma continua a occupare memoria inutilmente. L’allocazione dinamica della memoria si realizza tramite l’operatore prefisso new. La deallocazione di tale memoria si realizza tramite l’operatore unario delete.

Operatore new L’operatore new permette di allocare memoria per uno o più oggetti nell’area heap e ne restituisce l’indirizzo new tipo [dimensione] tipo é il tipo dell’oggetto (o degli oggetti) da creare dimensione é il numero degli oggetti, che vengono sistemati nella memoria heap consecutivamente; se questo operando é omesso, viene costruito un solo oggetto In caso di errore (memoria libera/dinamica non disponibile) restituisce il valore NULL

Esempi int* punt = new int; alloca un oggetto int nell’area heap e usa il suo indirizzo per inizializzare il puntatore punt; struct anagrafico { }; anagrafico* p; p = new anagrafico [100]; definisce la struttura anagrafico e dichiara un puntatore a tale struttura, a cui assegna l’indirizzo del primo di cento oggetti di tipo anagrafico, allocati nell’area heap.

Operatore delete L’operatore unario delete dealloca (libera) la memoria dell’area heap puntata dall’operando. int* punt = new int; allocazione delete punt; deallocazione L’operatore delete non cancella la variabile puntatore né altera il suo contenuto: l’unico effetto é di liberare la memoria puntata rendendola disponibile per eventuali ulteriori allocazioni.

Operatore delete L’operatore delete può essere applicato solo ad un puntatore che indirizza un oggetto allocato mediante una new mantenendo la correttezza semantica dell’operazione. Non esiste alcun controllo sull’uso congruente degli operatori new e delete, sono sotto la sola gestione del programmatore.

Operatore delete Se delete punta a un’area in cui sono stati allocati più oggetti, l’operatore va ulteriormente specificato con una coppia di parentesi quadre (senza la dimensione, che il C++ é in grado di riconoscere automaticamente). float * punt = new float [100]; ( alloca 100 oggetti float ) delete[] punt; (libera tutta la memoria allocata)

Operatore delete L’operatore delete costituisce l’unico mezzo per deallocare memoria heap, che, altrimenti, sopravvive fino alla fine del programma, anche quando non é più raggiungibile. int* punt = new int; ( alloca un intero nell’area heap) int a; ( definisce la variabile a intera) punt = &a; (assegna a punt l’indirizzo di a) L’oggetto intero dell’area heap non é più raggiungibile in quanto con l’ultima assegnazione si è distrutto il valore iniziale di p (indirizzo ritornato da new) !

L’operatore di indirizzo & Indirizzi, puntatori Aritmetica dei puntatori L’operatore di dereferenziazione * Puntatori

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 di una variabile non può essere assegnato in un’istruzione, ma è predeterminato)

Operatore di indirizzo & Es.: &aammesso &(a+1) non ammesso &a = bnon ammesso Perché? (in quanto l’indirizzo di memoria di una variabile non può essere modificato in un’istruzione, ma solo usato come riferimento in quanto è predeterminato e non modificabile)

Puntatori Una variabile di tipo puntatore é designata a contenere l’indirizzo di memoria di un’altra variabile (detta variabile puntata), la quale a sua volta può essere di qualunque tipo, anche non nativo (persino un altro puntatore!). reg. 1000“N” IndirizzoValore Variabile dato di tipo carattere reg IndirizzoValore Variabile dato di tipo puntatore reg. 8000

Dichiarazione di variabile puntatore Esistono puntatori per ogni tipo di variabile puntata Un dato puntatore può puntare solo a un determinato tipo di variabili, quello specificato nella dichiarazione Si usa il qualificatore di tipo (suffisso) * Es. :int* pointer; dichiara la variabile pointer, puntatore ad una qualunque variabile di tipo int Si può anche dichiarare un puntatore a puntatore. Es.:double** pointer_to_pointer;

Puntatore void Un puntatore void è un puntatore generico che accetta come valore un indirizzo ma non punta ad un tipo dato ben determinato. Il puntatore void si riferisce ad oggetti di tipo diverso int i; int* pi=&i; char c; char* pc=&c; void* tp; tp=pi; *(int*) tp=3; tp=pc; *(char*) tp=‘c’;

Assegnazione di valore a un puntatore NON si possono assegnare valori a un puntatore, salvo che in questi tre casi: 1.a un puntatore é assegnato il valore NULL (non punta a “niente”) 2.a un puntatore è assegnato l’indirizzo di una variabile esistente, restituito dall’operatore & ( Es. int a; int* p; p=&a; ) 3.é eseguita un’operazione di allocazione dinamica della memoria

Operazioni sui puntatori Operazioni fondamentali: Assegnazione di valore (indirizzo) ad un puntatore int* pi = &i p = q Riferimento all’oggetto puntato *pi=3 Confronto tra puntatori (==, !=)

Operazioni sui puntatori E’ possibile specificare che un dato puntatore non deve essere usato per modificare l’oggetto puntato attraverso la parola chiave const : int i; const int* p=&i; Le istruzioni in cui si usa p per aggiornare i vengono segnalate come erronee

Operazioni sui puntatori E’ possibile specificare con la parola chiave const che un puntatore non deve essere modificato: int i; int* const p=&i; Le istruzioni in cui si vuole modificare il valore di p vengono segnalate come erronee

Aritmetica dei puntatori (1) Il valore assunto da un puntatore é un numero intero che rappresenta, in byte, un indirizzo di memoria le operazioni di somma fra un puntatore e un valore intero (con risultato puntatore), oppure di sottrazione fra due puntatori (con risultato intero) vengono eseguite tenendo conto del tipo della variabile puntata Es.: se si incrementa un puntatore-a-float di 3 unità, il suo valore viene incrementato di 12 byte.

Aritmetica dei puntatori (2) Se l’espressione p rappresenta l’indirizzo di un oggetto di tipo T, allora l’espressione p+1 rappresenta l’indirizzo di un oggetto di tipo T allocato consecutivamente in memoria. In generale: se i è un intero, se p rappresenta l’indirizzo addr di T che occupa n locazioni di memoria, allora l’espressione p+i ha valore addr+ n x i

Aritmetica dei puntatori (3) Le regole dell’aritmetica dei puntatori assicurano che il risultato sia sempre corretto, qualsiasi sia la lunghezza in byte della variabile puntata. Es.: se p punta a un elemento di un array, p++ punterà all’elemento successivo, qualunque sia il tipo (anche non nativo) dell’array

L’operatore di dereferenziazione * L’operatore unario di dereferenziazione * di un puntatore restituisce il valore della variabile puntata dall’operando: come r-value, esegue un’operazione di estrazione Es.: a = *p; assegna ad a il valore della variabile puntata da p come l-value, esegue un’operazione di inserimento Es.: *p = a; assegna il valore di a alla variabile puntata da p

L’operatore di dereferenziazione * l’operazione di deref. é inversa a quella di indirizzo. Se assegniamo a un puntatore p l’indirizzo di una variabile a, p = &a; allora *p == a cioè la deref. di p coincide con a

L’operatore di dereferenziazione * ATTENZIONE: non é detto il contrario !!! se si assegna alla deref. di p il valore di a, *p = a ; ciò non comporta automaticamente che in p si ritrovi l’indirizzo di a, ma semplicemente che il valore della variabile puntata da p coinciderà con a

Puntatori e riferimenti Un riferimento è un nome alternativo per un oggetto e va sempre inizializzato Un riferimento è un puntatore costante che viene dereferenziato ogni volta che viene utilizzato void g() int ii=0; int& rr=ii ; // inizializzazione rr++; // ii viene incrementato di 1 int *pp=&rr; // pp punta ad ii

Attenzione! la dichiarazione di un puntatore comporta allocazione di memoria per la variabile puntatore, ma non per la variabile puntata. Es.: int* lista; alloca memoria per lista ma non per la variabile puntata da lista

int a = 1; int b = 7; int* pa = &a; int* pb = &b; int temp; temp = a; a = b; b = temp; 1 a 7 b pa pb int temp; temp = *pa; *pa = *pb; *pb = temp; 7 a 1 b 1 temp pa pb Scambio dei valori di a e b Oppure, usando pa e pb Esempio

int a = 1; int b = 7; int* pa = &a; int* pb = &b; int* tempp; tempp = pa; pa = pb; pb = tempp; 1 a 7 b pa pb 1 a 7 b tempp pa pb Scambio dei puntatori di a e b Esempio