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 8 Aprile 2015.

Presentazioni simili


Presentazione sul tema: "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015."— Transcript della presentazione:

1 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 8 Aprile 2015

2 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Logistica… 1ma prova 22 Aprile  3.30pm @ NECST Lab 24 Aprile  4.15pm @ CG1 2

3 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fine corso… 26 Giugno 2015 Visita al Centro di Supercomputing Svizzero (CSCS) http://tinyurl.com/CSCS2015 3

4 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEImmagini 4 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

5 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? 5 void TagliaRossi(pixel immagine[30][24], int soglia);

6 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE RICORDIAMO: passaggio per valore } /* nel main */ float valore1, valore2; float risultato; risultato=somma(valore1,valore2); 6 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

7 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEQuindi…. /* nel main */ pixel img[30][24]; int val_soglia; TagliaRossi(img[30][24], val_soglia); 7 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

8 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 8

9 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E quindi (veramente)… 9 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

10 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEObiettivi Puntatori 10

11 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 11 int var; 0 1 2 3 var &var

12 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 12

13 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; 13

14 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 14 int *p; 0 1 2 3 p &p

15 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 15

16 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 16 1 5 0 1 2 3 x &p &x p

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

18 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 18

19 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 */ 19 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

20 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio valori Si scriva una funzione in C che, dati due valori interi, gli restituisce scambiati 20

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 3 7

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 3 7 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 7 7 3

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 7 3 3

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 7 3 3 Al termine dell’esecuzione di swap le variabili nel main restano inalterate!

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 3 7 p q temp

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 3 7 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 7 p q temp 3

29 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) 29 a b 7 3 p q temp 3

30 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) 30 a b 7 3 p q temp 3 Al termine dell’esecuzione di swap le variabili nel main vengono modificate

31 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Particolarità delle stringhe Il nome dell’array rappresenta l’indirizzo del suo primo elemento, perciò quando ci si vuole riferire all’intero array nella scanf non si mette il simbolo &! scanf("%s", stringa); Questa scanf legge in input i caratteri fino a quando trova il carattere “ blank ” (lo spazio), o l’invio  NOTA: se nel buffer si trova una stringa “troppo lunga”, essa è memorizzata oltre la fine dell ’ array !!! Ed è un errore grave !!! Attenzione! Gli array (TUTTI) sono sempre passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore 31

32 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe Si scriva un programma in C che, data una stringa, la copia in una seconda stringa 32

33 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 33

34 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 34

35 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 35 Attenzione! Gli array (TUTTI) sono sempre passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore

36 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: dati e inserimento 36 #define DIM 5 […] char stringa1[DIM];

37 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: lunghezza 37

38 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: lunghezza 38

39 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: lunghezza v2 39

40 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: copia elementi 40

41 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: copia elementi 41

42 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Copia stringhe: tutto insieme 42

43 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E se usassimo le librerie? 43

44 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe 44

45 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ecco perché string.h!!! 45

46 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe 46

47 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 47 char str1[32]; /  str1 ha spazio per 32 char.  / char str2[64]; /  str2 ha spazio per 64 char.  / /  inizializza str1 con la stringa "alfa"  / strcpy(str1, "alfa"); /  str1 contiene "alfa"  / /  copia str1 in str2  / strcpy(str2, str1); /  str2 contiene "alfa"  / /  lunghezza di str1  / x = strlen(str1); /  x assume valore 4  / /  scrivi str1 su standard output  / printf("%s", str1); /  scrive str1 su stdout  / /  leggi str1 da standard input  / scanf("%s", str1); /  str1 “ riceve ” da stdin  / Operazioni su stringhe

48 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 48 char str1[32]; char str2[64]; scanf("%s", str1); > ciao  /  ora str1 contiene "ciao"  / strcpy(str2, str1);/  str2 riceve "ciao"  / val = strlen(str2); /  val = 4  / printf("%s\n", str2); > ciao/  stampa "ciao"  / Attenzione: strlen("") vale 0 ! Operazioni su stringhe

49 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fonti per lo studio + Credits Fonti per lo studio  Binky Pointer Fun Video: http://cslibrary.stanford.edu/104/ http://cslibrary.stanford.edu/104/ Credits  Gianluca Palermo 49


Scaricare ppt "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015."

Presentazioni simili


Annunci Google