DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio –...

36
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Puntatori Marco D. Santambrogio – [email protected] Ver. aggiornata al 4 Aprile 2013

Transcript of DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio –...

Page 1: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

PuntatoriPuntatori

Marco D. Santambrogio – [email protected]. aggiornata al 4 Aprile 2013

Page 2: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

WAT?WAT?

• LabLab Troppi exe, ne volevo di menoTroppi exe, ne volevo di meno

• VacanzeVacanze Giovedì 28, Venerdì 29 e Lunedì 1Giovedì 28, Venerdì 29 e Lunedì 1 ma anche Martedì 2 e Mercoledì 3ma anche Martedì 2 e Mercoledì 3

• Homework @ DEIBHomework @ DEIB Giovedì 4 Aprile dalle 5.30pm alle Giovedì 4 Aprile dalle 5.30pm alle

7.30pm7.30pm

2

WAT

WATWAT

Page 3: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

ImmaginiImmagini

3

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

Page 4: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Manipoliamo immagineManipoliamo 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?

4

void TagliaRossi(pixel immagine[30][24], int soglia);

Page 5: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

RICORDIAMO: passaggio per RICORDIAMO: passaggio per valorevalore

}

/* nel main */

float valore1, valore2;

float risultato;

risultato=somma(valore1,valore2);

5

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 funzionetermina il valore di risultato in somma viene copiato il risultato nel main

Page 6: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Quindi….Quindi….

/* nel main */

pixel img[30][24];

int val_soglia;

TagliaRossi(img[30][24], val_soglia);

6

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

Page 7: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Cosa ci piacerebbe?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

7

Page 8: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

E quindi (veramente)…E quindi (veramente)…

8

pixel img[30][24];Sapendo dove si trova il primo punto

aka: indirizzo primo pixel img[0][0]

Con le dimensione della matrice:Righe: 30Colonne: 24

Possiamo arrivare ad ogni punto (r,c)!!!Indirizzo di img[0][0] + r*Colonne + c

&img[0][0] + r*Colonne + c

Page 9: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

ObiettiviObiettivi

• Puntatori

9

Page 10: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Variabili e indirizziVariabili 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

10

int var;

0

1

2

3

var&var

Page 11: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Puntatori – premessa 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

11

Page 12: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

PuntatorePuntatore

• È 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;

12

Page 13: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

SignificatoSignificato

• 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

13

int *p;

0

1

2

3

p&p

Page 14: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

DeferenziazioneDeferenziazione

• 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

14

Page 15: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

OperazioniOperazioni

• 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

15

1

5

0

1

2

3

x

&p

&x

p

Page 16: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Pointer Fun with BinkyPointer Fun with Binky

16

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.

Page 17: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Passaggio per INDIRIZZOPassaggio 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

17

Page 18: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Passaggio parametri per Passaggio parametri per indirizzoindirizzo

• Si utilizza: il costruttore di tipo puntatore per la definizione

dei parametri formali della funzionefloat circonferenza(float *raggio)

l’operatore di dereferenziazione all’interno della funzionecirc = *raggio * 3.14;

alla chiamata della funzione, si passa un indirizzo di variabile come parametro attualec=circonferenza(&r);

• Attenzione! Gli array sono SEMPRE passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore

18

Page 19: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: passaggio per Esempio: passaggio per indirizzoindirizzo

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 poir 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 funzionetermina il valore di circ in circonferenza viene copiato in c nel main

Page 20: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi 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

Page 21: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi 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

3

Page 22: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi 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

7

3

Page 23: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi 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

3

3

Page 24: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi 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

3Al termine dell’esecuzione di swap le variabili nel main restano inalterate!

Page 25: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interiEsempio: 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

Page 26: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interiEsempio: 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

temp3

Page 27: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interiEsempio: 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

7

p

q

temp3

Page 28: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interiEsempio: 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

temp3

Page 29: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interiEsempio: 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

temp3

Al termine dell’esecuzione di swap le variabili nel main vengono modificate

Page 30: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

scanf: stringhe Vs charscanf: stringhe Vs char

30

Page 31: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Parametri di tipo arrayParametri 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)!!

31

Page 32: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

SSomma degli elementi di un array omma degli elementi di un array di di intint

32

Page 33: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

SSomma degli elementi di un array omma degli elementi di un array di di int: funzioniint: funzioni

33

Page 34: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

SSomma degli elementi di un array omma degli elementi di un array di di int: funzioni – con int *valoriint: funzioni – con int *valori

34

Page 35: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Parametri di tipo arrayParametri 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]

35

Page 36: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 4 Aprile 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Fonti per lo studio + Fonti per lo studio + CreditsCredits• Fonti per lo studio

Binky Pointer Fun Video: http://cslibrary.stanford.edu/104/

• Credits Gianluca Palermo

36