Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Puntatori e gestione dinamica della RAM
Laboratorio di Linguaggi lezione I: "Hello, world!" Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
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.
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Fondamenti di Informatica Prof. Cantone
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.
Caratteri e stringhe di caratteri
Esercizi su alberi binari
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 IV: tipi definiti dallutente Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.
Laboratorio di Linguaggi lezione VI Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione I: "Hello, world!" Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
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 IX Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
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 IV 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 lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.
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 IX: Dentro le Librerie 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 III: tipi base, espressioni, type-cast Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e.
Laboratorio di Linguaggi lezione V: puntatori (1/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 XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione IX: tipi ricorsivi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08.
Laboratorio di Linguaggi lezione II Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Corso di Informatica Applicata Lezione 6
Esercizi su alberi binari
Approfondimento delle classi
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
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.
Programmazione di Calcolatori
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
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
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
Grafi Rappresentazione mediante liste di adiacenza:
Complessità di un algoritmo
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.
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
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.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
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.
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.
Laboratorio di Linguaggi... altre D O M A N D E ! Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione XI Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione II Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Assegnare i Puntatori In memoria, un puntatore è un indirizzo di memoria –(...di una variabile) –(...di cui e' noto il tipo) Bene, ma quale indirizzo? –Modo 1: prendere l'indirizzo di una variabile esistente il puntatore punterà a quella variabile –Modo 2: allocare (riservare, prenotare) della memoria libera il puntatore punterà ad una nuova variabile, memorizzata nella memoria così riservata la nuova variabile è allocata dinamicamente!

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Assegnare i Puntatori Modo 1: prendere l'indirizzo di una variabile esistente –il puntatore punterà a quella variabile Operatore "ampersand" ( ) Esempio: & double d = 9.0; double *p; p = &d; *p = 21.5; printf("%f",*p); il puntatore p punta all'indirizzo di memoria dove vive la variabile d scrivi il valore di *p. Cosa scrive? printf("%f",d); scrivi il valore di d. Cosa scrive?

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Operatore & e i tipi se y è una var di tipo T... & y T T*

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Operatore & e vettori int numeri[]={10,20,30,40}; int *punt; punt = & numeri; errore di tipo! numeri non è mica di tipo int ! (e quindi &numeri non è di tipo int* ) punt = & (numeri[0]); si può scrivere invece: oppure anche: punt = numeri; int i; for (i=0; i<4; i++) { printf("%d ", numeri[i]); } scriviamo tutti e 4 i numeri: int i; for (i=0; i<4; i++) { printf("%d ", *(punt++)); } usando i puntatori:

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Altro Esempio char stringa[]="puntatore"; int i; while (stringa[i]) { stringa[i] = maiuscolo(stringa[i]); i++; } char stringa[]="Puntatore"; char *p = stringa; while (*p) { *p = maiuscolo( *p ); p++; } 'p' 'u' 'n' 't' 'a' 't' 'o' 'r' 'e' 0 stringa[0] stringa[1] stringa[2] stringa[3] stringa[4] stringa[5] stringa[6] stringa[7] stringa[8] stringa[9] stringa p p p p p p p p p p

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Uso dei Puntatori come Parametri vi ricordate quel problemino? void raddoppia (int x) { x = x * 2; } int main(){ int incassi = 5; raddoppia( incassi );... } void raddoppia (int x) { x = x * 2; } int main(){ int incassi = 5; raddoppia( incassi );... } * * & Remember: in C i paramatri sono passati per copia !

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Uso dei Puntatori come Parametri un'altra motivazione possibile: efficienza int eta_fra_10_anni (Persona pp) { return pp.eta + 10; } int eta_fra_10_anni (Persona * pp) { return pp->eta + 10; } ogni volta che si chiama questa funzione, vengono copiati sizeof(Persona) bytes. ogni volta che si chiama questa funzione, vengono copiati sizeof(Persona*) bytes. typedef struct { char nome[20]; char cognome[20]; int eta; Esami* esami_sostenuti[50]; } Persona;

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Uso dei Puntatori come Parametri un'altra motivazione possibile: efficienza int eta_fra_10_anni (Persona pp) { return pp.eta + 10; } int eta_fra_10_anni (Persona * pp) { return pp->eta + 10; } inefficiente efficiente più informazione presente nel codice per il programmatore (un po' come un commento) più ottimizzazioni possibili da parte del compilatore più controllo di errori a tempo di compilazione (per esempio se per sbaglio si tenta di cambiare il valore del parametro) In questi casi, però, meglio aggiungere anche la keyword const : int eta_fra_10_anni (const Persona * pp) { return pp->eta + 10; }

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Uso dei Puntatori come Parametri Riassumendo: void Procedura( TipoParametro x) {... } void Procedura( TipoParametro* x) {... } void Procedura( const TipoParametro* x) {... } passaggio di parametro per copia (l'unico possibile in C) tecnicamente, altri passaggi di parametro per copia ma ciò che si copia è un puntatore, cioè un riferimento! in pratica, (simulazione di) un passaggio di parametro per riferimento

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Uso dei Puntatori come Parametri Riassumendo: void Procedura( TipoParametro x) {... } void Procedura( TipoParametro* x) {... } void Procedura( const TipoParametro* x) {... } usare quando la procedura non deve cambiare il valore del parametro usare quando la procedura deve cambiare il valore del parametro usare quando la procedura non deve cambiare il valore del parametro...ma sarebbe troppo oneroso fare la copia del parametro (parametro voluminoso!)

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Assegnare i Puntatori In memoria, un puntatore è un indirizzo di memoria –(...di una variabile) –(...di cui e' noto il tipo) Bene, ma quale indirizzo? –Modo 1: prendere l'indirizzo di una variabile esistente il puntatore punterà a quella variabile –Modo 2: allocare (riservare, prenotare) della memoria libera il puntatore punterà ad una nuova variabile, memorizzata nella memoria così riservata la nuova variabile è allocata dinamicamente!

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Allocazione void* malloc(unsigned int n); funzione malloc ( sta per m emory alloc ation ) 1 - alloca n bytes di memoria. 2 - restituisce l' indirizzo della memoria appena allocata sotto forma di puntatore generico ! " " puntatore generico, puntatore senza tipo, in pratica, un semplice indirizzo di memoria void*

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Allocazione: esempio int* p; p = malloc( ? ); Ma il tipo non torna! A sx abbiamo un (int*) mentre a dx un (void*) Avviene un Typecast fra puntatori int* p; p = (int*) malloc(4); Possiamo anche renderlo esplicito (meglio): 4

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Typecast fra puntatori Ogni tipo puntatore puo essere trasformato in un qualsiasi altro tipo di puntatore: (implicitamente o esplicitamente) –da int* a double*, da void* a Persona* etc. Semantica: = quello che fa –Lindirizzo rimane lo stesso, cambia linterpretazione di ciò che ci trovo –Nota: in effetti, a tempo di esecuzione, non avviene nulla! Cambiano solo cose nella testa del compilatore Costrutto estremamente POTENTE e di basso livello (e potenzialmente molto pacciugone)

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Typecast fra puntatori: primo esempio int* p; p = malloc( 4 ); int* p; p = (int*) malloc(4); Esplicito (meglio, più chiaro): Implicito:

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Allocazione: e se la memoria finisce? void* malloc(unsigned int n); Se non c'è più memoria, l'allocazione "fallisce" e malloc restituisce il valore speciale NULL semanticamente, NULL è un "puntatore che non punta a nulla" NULL è rappresentato dal valore 0 Quindi, il valore resituito dalle malloc va controllato ! int* p; p = (int*) malloc(4); if (p == NULL) { /* finita memoria... */ } oppure, più coincisamente if (!p) {

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Allocazione Il costrutto sizeof è estremamente utile con le malloc. Usare sempre, anche con i tipi base int, short, float, double... remember: il C non prescrive quanti bytes occupano! typedef struct { /*blah blah... un sacco di campi, array...*/ } TipoStrano TipoStrano* p; p = (TipoStrano *) malloc(sizeof(TipoStrano));

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Dellocazione void free(void* p); libera la memoria che era stata allocata all'indirizzo p. Nota: p deve essere il risultato di una malloc! int* p; p = (int*) malloc(sizeof(int));... /* Qui uso (*p) */ free(p); se mi dimentico di deallocare, ho un cosiddetto memory leak Remember: non c'è alcuna garbage collection in C !

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i / U n i v e r s i t à d e l l I n s u b r i a Allocazione e Deallocazione: esempio int proc() { int k; k=15;... /* lavora con k */ return 0; }; int proc() { int* k; k = (int*)malloc( sizeof(int) ); *k = 15;... /* lavora con *k */ free(k); return 0; }; k viene automaticamente allocato (i 4 bytes di memoria necessari al suo immagazzinamento vengono "prenotati"). k viene inizializzato (a 15) all'uscita dalla procedura, i 4 bytes sono resi di nuovo disponibili k viene esplicitamente allocato. (a tempo di esecuzione, si trovano i 4 bytes di memoria necessari al suo immagazzinamento. La locazione viene memorizzata in k). k viene inizializzato (a 15) all'uscita dalla procedura, dobbiamo rendere i 4 bytes di nuovo disponibili esplicitamente usando l'allocazione dinamica: usando l'allocazione automatica delle variabili locali: