Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà...

23
Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08

Transcript of Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà...

Page 1: 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 V: puntatori (1/3)

Marco Tarini

Università dell’Insubria

Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese

Corso di Laurea in Informatica

Anno Accademico 2007/08

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

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

E' arrivato il momento de...

I PUNTATORI

Page 3: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: intro

• Una tipo variabile che contiene un indirizzo di una locazione di memoria: – l'indirizzo di un'altra variabile!

Page 4: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: sintassi della dichiarazione

int* pippo; " pippo " è una var di tipo int*, cioè puntatore ad intero

int *pippo;" *pippo " (cioè il valore puntato da pippo)è una var di tipo intero

o se preferite:

Page 5: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: sintassi dell'uso

pippo il valore del puntatore.

*pippo il valore dell'oggetto puntato.

entrambi possono essere sia letti che assegnati (possono comparire da entrambi i lati di un assegnamento)

Page 6: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: preambolo

Cosa succede normalmente…int pippo = 0xA0;

0x00000000

0xFFFFFFFF

il compilatore assegnaalla variabile pippouna locazione di memoria.

Ad esempio, lalocazione 0x612A22C

Inoltre, riserva queiquattro byte per lavariabile pippo.

spazi

o d

eg

li in

dir

izzi

lo

gic

i

0x612A0230

0x612A022C

0x612A0228

0x612A0224

0x612A0220

0x612A021C

0x612A0218

0x612A0214 00 00 00 FF

01 22 00 AB

21 00 00 00

12 23 D2 FF

FF 02 41 A4

21 2A 02 2C

00 00 00 A0

12 33 A3 D0

m e

m

o

r

i a

Page 7: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

0x612A0230

0x612A022C

0x612A0228

0x612A0224

0x612A0220

0x612A021C

0x612A0218

0x612A0214 00 00 00 FF

01 22 00 AB

21 00 00 00

12 23 D2 FF

FF 02 41 A4

21 2A 02 2C

00 00 00 A0

12 33 A3 D0

m e

m

o

r

i a

Puntatori: preambolo

Cosa succede normalmente…int pippo = 0xA0;pippo = 0x00AABB00;

0x00000000

0xFFFFFFFF

il compilatore assegnaalla variabile pippouna locazione di memoria.

Ad esempio, lalocazione 0x612A22C

Inoltre, riserva queiquattro byte per lavariabile pippo.

spazi

o d

eg

li in

dir

izzi

lo

gic

i

Inoltrevariabile tipo locazione

pippo int 0x612A22C

dopo la complazione STORE 0x0612A22C 0x00AABB00

00 AA BB 00

Page 8: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: significato

int* pippo;

0x612A0230

0x612A022C

0x612A0228

0x612A0224

0x612A0220

0x612A021C

0x612A0218

0x612A0214 00 00 00 FF

01 22 00 AB

21 00 00 00

12 23 D2 FF

FF 02 41 A4

61 2A 02 1C

00 00 00 A0

12 33 A3 D0

variabile tipo locazione

pippo int* 0x612A22Cindirizzo

pippo

*pippo

pippo

*pippo

m e

m

o

r

i a

(il puntatore stesso) vale...

(la variabile puntata da pippo) vale...

0x612A021C

0x000000A0

Page 9: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Cambiare il valore del puntatore

pippo ;

0x612A0230

0x612A022C

0x612A0228

0x612A0224

0x612A0220

0x612A021C

0x612A0218

0x612A0214 00 00 00 FF

01 22 00 AB

21 00 00 00

12 23 D2 FF

FF 02 41 A4

61 2A 02 1C

00 00 00 A0

12 33 A3 D0

variabile tipo locazione

pippo int* 0x612A22Cindirizzo

*pippo

pippo

+4

61 2A 02 20

pippo

*pippo

m e

m

o

r

i a

++

(il puntatore stesso) vale...

(la variabile puntata da pippo) vale...

0x612A021C

0x000000A0

Page 10: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Cambiare il valore del puntatore

pippo++;

0x612A0230

0x612A022C

0x612A0228

0x612A0224

0x612A0220

0x612A021C

0x612A0218

0x612A0214 00 00 00 FF

01 22 00 AB

21 00 00 00

12 23 D2 FF

FF 02 41 A4

61 2A 02 1C

00 00 00 A0

12 33 A3 D0

variabile tipo locazione

pippo int* 0x612A22Cindirizzo

*pippo

pippo61 2A 02 20

pippo

*pippo

0x612A0220

0x1223D2FF

m e

m

o

r

i a

(il puntatore stesso) vale...

(la variabile puntata da pippo) vale...

0x612A021C

0x000000A0

Page 11: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Cambiare il valore del valore puntato

*pippo = 0x00AABB00;

0x612A0230

0x612A022C

0x612A0228

0x612A0224

0x612A0220

0x612A021C

0x612A0218

0x612A0214 00 00 00 FF

01 22 00 AB

21 00 00 00

12 23 D2 FF

FF 02 41 A4

00 00 00 A0

12 33 A3 D0

variabile tipo locazione

pippo int* 0x612A22Cindirizzo

*pippo

pippo61 2A 02 20

00 AA BB 00

m e

m

o

r

i a

Page 12: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

I è una costante intera (vale 10)

i è una variabile intera

ip è un puntatore ad un intero

Considerazione sull'efficienza

const int I=10; int i;int* ip;

STORE 10 0xCC000000

int x; ...

x = I;

x = i;

x = *ip;

READ TEMP 0xAA000000 STORE TEMP 0xCC000000

compilazione

compilazione

compilazione READ TEMP0 0xBB000000 READ TEMP1 TEMP0STORE TEMP1 0xCC000000

ide. tipo locazione o

I int 10

valore

iip

intint*

---

0xBB000000

0xCC000000

0xAA000000 ---

---

---x int

tabella

dei Sim

boli

del co

mpila

tore

Page 13: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

I è una costante intera (vale 10)

i è una variabile intera

ip è un puntatore ad un intero

Considerazione sull'efficienza: assegnamento

const int I=10; int i;int* ip;

int x; ...

I = 15;

i = 15;

*ip = 15;

STORE 15 0xAA000000 compilazione

compilazione READ TEMP 0xBB000000 STORE 15 TEMP

ide. tipo locazione o

I int 10

valore

iip

intint*

---

0xBB000000

0xCC000000

0xAA000000 ---

---

---x int

tabella

dei Sim

boli

del co

mpila

tore

(le costanti non si assegnano -- casomai si inizializzano)

Page 14: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Considerazione sull'efficienza: esercizio

a = *p;

a = b;

a = 15;

*p = 15;

*p = b;

*p = *p2;

accessi alla memoriain scrittura

accessi alla memoriain lettura

comando

1

1

1

1

1

1

0

1

2

1

2

3

Page 15: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Algebra dei Puntatori

• L'operazione base sui puntatori: somma con un intero

<puntatore ad un tipo T> + <intero>

espressione di tipo puntatore ad un tipo T (T*)

• Semantica:

• è il puntatore che punta una loc. i elementi (di tipo T ) dopo p;

• come indirizzo di memoria, è l'indirizzo p + i x (dimensione diT )

p + i

Page 16: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Algebra dei Puntatori

• Esempi

double *p, *q;...q = p + 3;*(p + 3)=2.0;q++;q--;q+=2;

Page 17: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Algebra dei Puntatori

IDEONA !!equivalenza

puntatori - vettori

Brain Kernighan

Page 18: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Algebra dei Puntatori

• Ripasso: vettori– in memoria, gli elementi di un array sono

memorizzati in una serie di celle contigue

– ogni cella ha la stessa grandezza– per questo gli array sono random access!int cartella[5]={

10,21,33,13,4,};

10

indirizzobase

di "cartella"

21 33 13 4

indirizzo di cartella[3] = (indirizzo base) + 3 x (dimensione cella)cartella[3]

dimensionecella (=4)

Page 19: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Algebra dei Puntatori

equivalente a

double *p;...

p[ 5 ]

*(p + 5)

Page 20: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori e struct

typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;

Persona *p;

...

come accedo al campo peso della Persona puntata da p?

Page 21: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori e struct (un pò di zucchero sintattico)

typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;

Persona *p;

...

*p.peso

come accedo al campo peso della Persona puntata da p?

(*p).peso

p->peso

o, equivalentemente, con l'apposito operatore "freccina":

p.peso* ( )interpretato

come

Page 22: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Zucchero sintattico

typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;

void pippo(Persona p) { ... if (p.peso == ... ) ...}

typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;

void pippo(Persona* p) { ... if (p->peso == ... ) ...}

Page 23: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.

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 - 2 0 0 7 / 0 8 - 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!