PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
Corso di Fondamenti di Programmazione canale E-O
INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
Uso avanzato di C.
Introduzione al linguaggio C
Puntatori in C e C++.
PUNTATORI Introduzione
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.
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Tail recursion: esempio
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Allocazione dinamica della memoria
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
CORSO DI PROGRAMMAZIONE II
Funzioni di Libreria per le stringhe DICHIARAZIONI CONTENUTE NEL FILE: char *strcpy( char *dest, const char *sorg ); Copia sorg in dest, incluso il carattere.
Selezione (=scelta) con “if-else”
Strutture di controllo nel C
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Dichiarazioni e tipi predefiniti nel linguaggio C
Algebra Lineare Esercizi assegnati.
La Programmazione Ricorsiva
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.
I File.
Espressioni condizionali
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Programmazione in Java Claudia Raibulet
Equazione di secondo grado.
CODIFICA Da flow-chart a C++.
In molti casi è utile assegnare a degli identificatori dei valori che restino costanti durante tutto il programma e che non possano essere cambiati nemmeno.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
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.
Passaggio di parametri per indirizzo
14 marzo 2002 Avvisi:.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Complessità di un algoritmo
s STRINGHE DI CARATTERI a p e \0
Programmazione in linguaggio C
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 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
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
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.
Allievi Elettrici - AA Le funzioni ricorsive in C
Programmazione in Java
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
STRUTTURA DI UN PROGRAMMA C In prima battuta, la struttura di un programma C è definita dalla seguente produzione: ::= { }
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
FUNZIONI... Una funzione permette di  dare un nome a una espressione  rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) {
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
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.
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 Esercizi su stringhe e file 15 Stringhe e file.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Transcript della presentazione:

PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo di variabili di tipo T. Esempio: int x = 8; int* p; p = &x; /* OK */

PUNTATORI int x = 8; int* p; p = &x; /* OK */ Da questo momento, *p e x sono due modi alternativi per denotare la stessa variabile x p 8

PUNTATORI int x = 8; int* p = &x; *p = 31; x--; Il valore di *p, alias x, è ora 30. Il valore di p, invece, rimane immutato. x p 8 30

PUNTATORI In questo momento, p punta a x, e perciò *p è un alias per x. Ma un puntatore non è legato per sempre alla stessa variabile: può puntare altrove. int x = 8, y = 66; int *p = &x; (*p)++;/* incrementa x */ p = &y;/* ora p punta a y */ (*p)--;/* decrementa y */

PUNTATORI In questo momento, p punta a x, e perciò *p è un alias per x. Ma un puntatore non è legato per sempre alla stessa variabile: può puntare altrove. int x = 8, y = 66; int *p = &x; (*p)++;/* incrementa x */ p = &y;/* ora p punta a y */ (*p)--;/* decrementa y */ Le parentesi intorno a (*p) sono necessarie per modi- ficare loggetto puntato da p e non p stesso.

PUNTATORI Un puntatore a T può contenere solo lin- dirizzo di variabili di tipo T: puntatori a tipi diversi sono incompatibili tra loro. Esempio: int x=8,*p; float *q; p = &x; /* OK */ q = p; /* NO! */ MOTIVO: il tipo del puntatore serve per dedurre il tipo delloggetto puntato, che è una informazione indispensabile per effettuare il dereferenziamento.

PUNTATORI Forzare un assegnamento fra puntatori a tipi diversi è possibile mediante un cast esplici- to, ma è molto pericoloso! int x=8,*p; float *q; q = (float*)&x; ATTENZIONE!! È facile scriverlo… … ma quasi sempre si ottengono solo guai! Aggirare il type system non è (quasi) mai una buona idea!!

IL SOLITO ESEMPIO void scambia(int* pa, int* pb) { int t; t = *pa ; *pa = *pb ; *pb = t; } main(){ int y = 5, x = 33; int *py = &y, *px = &x; scambia( px, py ); } Variazione sul tema: gli indirizzi di x e y sono posti in due puntatori px e py prima di passarli.

PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo di variabili di tipo T. Esempio: int x = 8; int* p; p = &x; /* OK */

PUNTATORI int x = 8; int* p; p = &x; /* OK */ Da questo momento, *p e x sono due modi alternativi per denotare la stessa variabile x p 8

PUNTATORI int x = 8; int* p = &x; *p = 31; x--; Il valore di *p, alias x, è ora 30. Il valore di p, invece, rimane immutato. x p 8 30

PUNTATORI In questo momento, p punta a x, e perciò *p è un alias per x. Ma un puntatore non è legato per sempre alla stessa variabile: può puntare altrove. int x = 8, y = 66; int *p = &x; (*p)++;/* incrementa x */ p = &y;/* ora p punta a y */ (*p)--;/* decrementa y */

PUNTATORI In questo momento, p punta a x, e perciò *p è un alias per x. Ma un puntatore non è legato per sempre alla stessa variabile: può puntare altrove. int x = 8, y = 66; int *p = &x; (*p)++;/* incrementa x */ p = &y;/* ora p punta a y */ (*p)--;/* decrementa y */ Le parentesi intorno a (*p) sono necessarie per modi- ficare loggetto puntato da p e non p stesso.

PUNTATORI Un puntatore a T può contenere solo lin- dirizzo di variabili di tipo T: puntatori a tipi diversi sono incompatibili tra loro. Esempio: int x=8,*p; float *q; p = &x; /* OK */ q = p; /* NO! */ MOTIVO: il tipo del puntatore serve per dedurre il tipo delloggetto puntato, che è una informazione indispensabile per effettuare il dereferenziamento.

PUNTATORI Forzare un assegnamento fra puntatori a tipi diversi è possibile mediante un cast esplici- to, ma è molto pericoloso! int x=8,*p; float *q; q = (float*)&x; ATTENZIONE!! È facile scriverlo… … ma quasi sempre si ottengono solo guai! Aggirare il type system non è (quasi) mai una buona idea!!

IL SOLITO ESEMPIO void scambia(int* pa, int* pb) { int t; t = *pa ; *pa = *pb ; *pb = t; } main(){ int y = 5, x = 33; int *py = &y, *px = &x; scambia( px, py ); } Variazione sul tema: gli indirizzi di x e y sono posti in due puntatori px e py prima di passarli.

IL SOLITO ESEMPIO Osserva: pa e pb sono copie di px e py! Il C passa davvero tutto sempre e solo per valore!

ESERCIZIO Scrivere una procedura che, dato un carattere C, lo trasformi in maiuscolo. Specifica di I° livello: void maiuscolo(char *pc); restituisce il maiuscolo di C Specifica di II° livello: Se *c non è una lettera minuscola, restituiscilo tale e quale. Altrimenti, per calcolare il corrispondente maiu- scolo, sfrutta l ordinamento della codifica dei caratteri: – ogni carattere è associato a un intero – le lettere da A a Z sono in sequenza – le lettere da a a z sono in sequenza

ESERCIZIO void maiuscolo(char *pc) { if (*pc 'z') return; else *pc –= 'a' - 'A'; } o anche: void maiuscolo(char *pc) { if (*pc>='a' && *pc<='z') *pc += 'A' - 'a'; } Cosa succede se si dimentica un asterisco?

COMUNICAZIONE TRAMITE ENVIRONMENT GLOBALE Una procedura può anche comunicare con il suo cliente mediante aree dati globali: un esempio sono le variabili globali del C. Esempio: Divisione intera x/y con calcolo di quoziente e resto. occorre calcolare due valori che supponiamo di mettere in due variabili globali.

COMUNICAZIONE TRAMITE ENVIRONMENT GLOBALE int quoziente, int resto; void dividi(int x, int y) { resto = x % y; quoziente = x/y; } main(){ dividi(33, 6); } Il risultato è nelle variabili globali quoziente e resto : il cliente deve andar- selo a prendere! Soprattutto, niente indica che sia là: bisogna saperlo.

LENVIRONMENT GLOBALE Le variabili globali in C: sono allocate nellarea dati globale esistono già prima della chiamata del main sono inizializzate automaticamente a 0 salvo diversa indicazione (preferibile!!) possono essere nascoste in una funzione da una variabile locale omonima sono visibili, previa dichiarazione extern, in tutti i file dellapplicazione

LENVIRONMENT GLOBALE Il fatto che le variabili globali in C siano visi- bili, previa dichiarazione extern, in tutti i file dellapplicazione pone dei problemi di prote- zione. Potrebbe essere utile avere variabili globali permanenti come tempo di vita ma protette, nel senso che solo una parte dellapplicazione possa accedervi.

VARIABILI STATICHE In C, una variabile può essere dichiarata static. In questo modo, essa: è permanente come tempo di vita ed è protetta, in quanto è visibile solo entro il suo scope di definizione. Nel caso di una variabile globale, ogni tentativo di accedervi da altri file, tramite dichiarazioni extern, sarà stroncato dal compilatore.

ESEMPIO static int cont = 3; int nextValue(){ return cont++; } La variabile cont è inaccessibile fuori da questo file (il suo scope di definizione); lunico modo di accedervi è tramite la funzione nextValue se un altro file definisse unaltra variabile globale cont, non ci sarebbe comunque collisione, perché la prima esternamente non esiste.

VARIABILI STATICHE Una variabile statica può essere definita anche dentro a una funzione. Così: è comunque protetta, in quanto visibile solo dentro alla funzione (come ogni variabile locale) ma è anche permanente, in quanto il suo tempo di vita diventa quello dellintero programma. È un mezzo per costruire componenti (fun- zioni) dotati di stato.

ESEMPIO int nextPrime(void) { static lastprime = 0; if (lastprime>=0 && lastprime<=2) return ++lastprime; else { do lastprime += 2; while (!isPrime(lastprime)); return lastprime; } } Questa funzione restituisce a ogni invocazione il suc- cessivo numero primo. È un componente dotato di stato: chiamato più volte, dà ogni volta una risposta diversa

VARIABILI STATICHE Quindi, la parola chiave static ha sempre e comunque due effetti –rende la variabile permanente –rende la variabile protetta (invisibile fuori dal suo scope di definizione) ma se ne vede sempre uno solo per volta –una variabile definita in una funzione, che è comunque protetta, viene resa permanente –una variabile globale, già di per sé permanente, viene resa protetta.

COMUNICAZIONE TRAMITE ENVIRONMENT GLOBALE Una procedura può anche comunicare con il suo cliente mediante aree dati globali: un esempio sono le variabili globali del C. Esempio: Divisione intera x/y con calcolo di quoziente e resto. occorre calcolare due valori che supponiamo di mettere in due variabili globali.

COMUNICAZIONE TRAMITE ENVIRONMENT GLOBALE int quoziente, int resto; void dividi(int x, int y) { resto = x % y; quoziente = x/y; } main(){ dividi(33, 6); } Il risultato è nelle variabili globali quoziente e resto : il cliente deve andar- selo a prendere! Soprattutto, niente indica che sia là: bisogna saperlo.

LENVIRONMENT GLOBALE Le variabili globali in C: sono allocate nellarea dati globale esistono già prima della chiamata del main sono inizializzate automaticamente a 0 salvo diversa indicazione (preferibile!!) possono essere nascoste in una funzione da una variabile locale omonima sono visibili, previa dichiarazione extern, in tutti i file dellapplicazione

LENVIRONMENT GLOBALE Il fatto che le variabili globali in C siano visi- bili, previa dichiarazione extern, in tutti i file dellapplicazione pone dei problemi di prote- zione. Potrebbe essere utile avere variabili globali permanenti come tempo di vita ma protette, nel senso che solo una parte dellapplicazione possa accedervi.

VARIABILI STATICHE In C, una variabile può essere dichiarata static. In questo modo, essa: è permanente come tempo di vita ed è protetta, in quanto è visibile solo entro il suo scope di definizione. Nel caso di una variabile globale, ogni tentativo di accedervi da altri file, tramite dichiarazioni extern, sarà stroncato dal compilatore.

ESEMPIO static int cont = 3; int nextValue(){ return cont++; } La variabile cont è inaccessibile fuori da questo file (il suo scope di definizione); lunico modo di accedervi è tramite la funzione nextValue se un altro file definisse unaltra variabile globale cont, non ci sarebbe comunque collisione, perché la prima esternamente non esiste.

VARIABILI STATICHE Una variabile statica può essere definita anche dentro a una funzione. Così: è comunque protetta, in quanto visibile solo dentro alla funzione (come ogni variabile locale) ma è anche permanente, in quanto il suo tempo di vita diventa quello dellintero programma. È un mezzo per costruire componenti (fun- zioni) dotati di stato.

ESEMPIO int nextPrime(void) { static lastprime = 0; if (lastprime>=0 && lastprime<=2) return ++lastprime; else { do lastprime += 2; while (!isPrime(lastprime)); return lastprime; } } Questa funzione restituisce a ogni invocazione il suc- cessivo numero primo. È un componente dotato di stato: chiamato più volte, dà ogni volta una risposta diversa

VARIABILI STATICHE Quindi, la parola chiave static ha sempre e comunque due effetti –rende la variabile permanente –rende la variabile protetta (invisibile fuori dal suo scope di definizione) ma se ne vede sempre uno solo per volta –una variabile definita in una funzione, che è comunque protetta, viene resa permanente –una variabile globale, già di per sé permanente, viene resa protetta.

FUNZIONI STATICHE Nel secondo significato (protezione e nascondimento), la parola chiave static può qualificare anche una funzione. –rende la funzione protetta (invisibile fuori dal file di definizione) –può servire per funzioni a uso interno, non destinate a essere invocate da altri static int f(...) {... }