La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.

Presentazioni simili


Presentazione sul tema: "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014."— Transcript della presentazione:

1 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014

2 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEImmagini 2 typedef struct{ int R; int G; int B; } pixel pixel img[30][24]; Struttura dati: Ma quanto è grossa immagine? pixel=(int*3) img= pixel*30*24 1 immagine= 2160 interi

3 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Manipoliamo immagine Problema: mettiamo a 0, tutti i pixel con rosso minore di 50 (soglia) Se volessimo scrivere una funzione che risolve il problema dato?  Cosa ritorna? NB: una immagine è un insieme di pixel, non un solo dato!  Quali sono i parametri di ingresso? 3 void TagliaRossi(pixel immagine[30][24], int soglia);

4 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE RICORDIAMO: passaggio per valore } /* nel main */ float valore1, valore2; float risultato; risultato=somma(valore1,valore2); 4 Ambiente della funzione somma d1, d2 risultato Ambiente della funzione main valore1, valore2 risultato Quando invoco la funzione in d1 e d2 vengono copiati i valori di valore1 e valore 2 Quando la funzione termina il valore di risultato in somma viene copiato il risultato nel main

5 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEQuindi…. /* nel main */ pixel img[30][24]; int val_soglia; TagliaRossi(img[30][24], val_soglia); 5 Ambiente della funzione TagliaRossi immagine[30][24] soglia Ambiente della funzione main img[30][24] val_soglia Quando invoco la funzione in immagine[30][24] vengono copiati i valori di img[30][24] void TagliaRossi(pixel immagine[30][24], int soglia); Perchè? Spreco di memoria: 2160 interi *2 array1=array2 : VIETATO in C

6 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Cosa ci piacerebbe? Avere una sola copia del dato  Non vogliamo sprecare spazio Poter accedere a quella copia in maniera sicura  Non vogliamo usare variabili globali! Sarebbe troppo alto il rischio di commettere errori! Invece che per copia, ci piacerebbe accedere tramite indirizzo 6

7 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E quindi (veramente)… 7 pixel img[30][24]; Sapendo dove si trova il primo punto aka: indirizzo primo pixel img[0][0] Con le dimensione della matrice: Righe: 30 Colonne: 24 Possiamo arrivare ad ogni punto (r,c)!!! Indirizzo di img[0][0] + r*Colonne + c &img[0][0] + r*Colonne + c

8 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEObiettivi Puntatori 8

9 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Variabili e indirizzi Supponiamo che la dichiarazione riservi la zona di memoria all’indirizzo 1 var indica il contenuto della cella di memoria &var indica l’indirizzo della cella di memoria 9 int var; var &var

10 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori – premessa Dichiarare una variabile significa riservare una zona di memoria composta da diverse celle  Il numero di celle dipende dal tipo di dato Ogni cella di memoria ha un indirizzo fisico e:  il nome della variabile indica il contenuto della cella di memoria  l’operatore & permette di ottenere l’indirizzo di memoria della cella associata alla variabile cui l’operatore è applicato 10

11 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEPuntatore È un tipo di dato che ammette tra i suoi valori un indirizzo di memoria  La zona di memoria viene detta “puntata” dalla variabile puntatore  La variabile puntatore viene detto che “punta” ad una cella di memoria Quando dichiaro un puntatore si deve anche specificare che tipo di dato viene ospitato nella cella puntata  Sintassi: int *p; 11

12 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONESignificato p è una variabile come tutte le altre quindi  p indica il contenuto della cella di memoria  &p indica l’indirizzo di memoria Quello che caratterizza una variabile di tipo puntatore è il fatto che il suo valore è esso stesso un indirizzo di memoria 12 int *p; p &p

13 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEDeferenziazione Ad una variabile di tipo puntatore posso applicare l’operatore di deferenziazione * *p indica il contenuto della cella puntata da p Se p è un puntatore ad un intero allora *p è una semplice variabile intera int *p; *p=5; /* OK. *p è un intero */ p=5; /* errore. p è un puntatore */ Attenzione! Il simbolo * lo uso sia nella dichiarazione che nella deferenziazione 13

14 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEOperazioni A una variabile di tipo puntatore posso assegnare un indirizzo di memoria int x; int *p; x=5; p=&x; /* *p vale 5 */ p punterà alla zona di memoria in cui è memorizzato il valore di x Ad una variabile puntatore non viene mai assegnato una costante x &p &x p

15 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Pointer Fun with Binky 15 This is document 104 in the Stanford CS Education Library. Please see for this and other free educational materials. Copyright Nick Parlante 1999.

16 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio per INDIRIZZO All’atto della chiamata l’indirizzo dei parametri attuali viene associato ai parametri formali  il parametro attuale e il parametro formale si riferiscono alla stessa cella di memoria Il sottoprogramma in esecuzione lavora nel suo ambiente sui parametri formali (e di conseguenza anche sui parametri attuali)  ogni modifica sul parametro formale è una modifica del corrispondente parametro attuale Gli effetti del sottoprogramma si manifestano nel chiamante con modifiche al suo ambiente locale di esecuzione 16

17 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio parametri per indirizzo Si utilizza:  il costruttore di tipo puntatore per la definizione dei parametri formali della funzione float circonferenza(float *raggio)  l’operatore di dereferenziazione all’interno della funzione circ = *raggio * 3.14;  alla chiamata della funzione, si passa un indirizzo di variabile come parametro attuale c=circonferenza(&r); Attenzione! Gli array sono SEMPRE passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore 17

18 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: passaggio per indirizzo float circonferenza(float *raggio) { float circ; circ = *raggio * 3.14; *raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; } /* nel main */ float c,r=5; c=circonferenza(&r); /*attenzione! D’ora in poi r vale 7 */ 18 Ambiente della funzione circonferenza raggio circ Ambiente della funzione main r c Quando invoco la funzione in raggio viene copiato l’indirizzo di r. Quindi *raggio e r sono la stessa cosa Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main

19 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 19 a b 3 7 p q temp 3 7

20 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 20 a b 3 7 p q temp 3 7 3

21 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 21 a b 3 7 p q temp 7 7 3

22 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 22 a b 3 7 p q temp 7 3 3

23 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 23 a b 3 7 p q temp Al termine dell’esecuzione di swap le variabili nel main restano inalterate!

24 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 24 a b 3 7 p q temp

25 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 25 a b 3 7 p q temp 3

26 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 26 a b 7 7 p q temp 3

27 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 27 a b 7 3 p q temp 3

28 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 28 a b 7 3 p q temp 3 Al termine dell’esecuzione di swap le variabili nel main vengono modificate

29 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE scanf: stringhe Vs char 29

30 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Parametri di tipo array Per usare in una funzione una variabile di tipo array occorre passare il suo indirizzo di base, perciò di fatto l’array è passato per locazione (indirizzo) Una funzione C non restituirà un array (come contenuto), ma solo un puntatore a un array (cioè il suo nome come suo indirizzo)!! 30

31 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Somma degli elementi di un array di int 31

32 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Somma degli elementi di un array di int: funzioni 32

33 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Somma degli elementi di un array di int: funzioni – con int *valori 33

34 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Parametri di tipo array Due testate equivalenti: double mul(double *a, int n) double mul(double a[], int n) N.B.: non c’è la dimensione, e n è la porzione occupata dell'array Supponiamo di avere un array V[50]. Possibili chiamate: mul(V,50) restituisce V[0]*V[1]*…V[49] mul(V,30) restituisce V[0]*V[1]*…V[29] mul(&V[5],7) restituisce V[5]*V[6]*…V[11] mul(V+5,7) restituisce V[5]*V[6]*…V[11] 34

35 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fonti per lo studio + Credits Fonti per lo studio  Binky Pointer Fun Video: Credits  Gianluca Palermo 35


Scaricare ppt "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014."

Presentazioni simili


Annunci Google