Laboratorio di linguaggi lezione v puntatori 1 3
This presentation is the property of its rightful owner.
Sponsored Links
1 / 23

Laboratorio di Linguaggi lezione V: puntatori (1/3) PowerPoint PPT Presentation


  • 70 Views
  • Uploaded on
  • Presentation posted in: General

Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08. Laboratorio di Linguaggi lezione V: puntatori (1/3). Marco Tarini. E' arrivato il momento de. I PUNTATORI. Puntatori: intro.

Download Presentation

Laboratorio di Linguaggi lezione V: puntatori (1/3)

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Laboratorio di linguaggi lezione v puntatori 1 3

Università dell’Insubria

Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese

Corso di Laurea in Informatica

Anno Accademico 2007/08

Laboratorio di Linguaggilezione V:puntatori (1/3)

Marco Tarini


E arrivato il momento de

E' arrivato il momento de...

I PUNTATORI

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

Puntatori: intro

  • Una tipo variabile che contiene un indirizzo di una locazione di memoria:

    • l'indirizzo di un'altra variabile!

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

Puntatori: sintassi della dichiarazione

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

int*pippo;

o se preferite:

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

int *pippo;

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

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)

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

Puntatori: preambolo

0x612A0214

00 00 00 FF

0x612A0218

01 22 00 AB

0x612A021C

21 2A 02 2C

0x612A0220

12 23 D2 FF

0x612A0224

FF 02 41 A4

0x612A0228

21 00 00 00

0x612A022C

00 00 00 A0

0x612A0230

12 33 A3 D0

Cosa succede normalmente…

int pippo = 0xA0;

il compilatore assegna

alla variabile pippo

una locazione di memoria.

Ad esempio, la

locazione 0x612A22C

Inoltre, riserva quei

quattro byte per la

variabile pippo.

0x00000000

m e m o r i a

spazio degli indirizzi logici

0xFFFFFFFF

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 preambolo1

Puntatori: preambolo

dopo la complazione

STORE 0x0612A22C 0x00AABB00

0x612A0214

00 00 00 FF

0x612A0218

01 22 00 AB

0x612A021C

21 2A 02 2C

0x612A0220

12 23 D2 FF

0x612A0224

FF 02 41 A4

0x612A0228

21 00 00 00

0x612A022C

00 00 00 A0

0x612A0230

12 33 A3 D0

Inoltre

variabile

tipo

locazione

00 AA BB 00

pippo

int

0x612A22C

Cosa succede normalmente…

int pippo = 0xA0;

pippo = 0x00AABB00;

il compilatore assegna

alla variabile pippo

una locazione di memoria.

Ad esempio, la

locazione 0x612A22C

Inoltre, riserva quei

quattro byte per la

variabile pippo.

0x00000000

m e m o r i a

spazio degli indirizzi logici

0xFFFFFFFF

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

Puntatori: significato

*pippo

pippo

pippo

*pippo

int*pippo;

variabile

tipo

locazione

pippo

int*

0x612A22C

indirizzo

0x612A0214

00 00 00 FF

0x612A0218

01 22 00 AB

0x612A021C

00 00 00 A0

0x612A0220

12 23 D2 FF

m e m o r i a

0x612A0224

FF 02 41 A4

0x612A0228

21 00 00 00

0x612A022C

61 2A 02 1C

0x612A0230

12 33 A3 D0

(il puntatore stesso) vale...

0x612A021C

(la variabilepuntata da pippo) vale...

0x000000A0

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

Cambiare il valore del puntatore

+4

61 2A 02 20

pippo ;

++

variabile

tipo

locazione

pippo

int*

0x612A22C

indirizzo

0x612A0214

00 00 00 FF

0x612A0218

01 22 00 AB

0x612A021C

00 00 00 A0

*pippo

0x612A0220

12 23 D2 FF

m e m o r i a

0x612A0224

FF 02 41 A4

0x612A0228

21 00 00 00

pippo

0x612A022C

61 2A 02 1C

0x612A0230

12 33 A3 D0

pippo

(il puntatore stesso) vale...

0x612A021C

(la variabilepuntata da pippo) vale...

*pippo

0x000000A0

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 puntatore1

Cambiare il valore del puntatore

61 2A 02 20

pippo++;

variabile

tipo

locazione

pippo

int*

0x612A22C

indirizzo

0x612A0214

00 00 00 FF

0x612A0218

01 22 00 AB

0x612A021C

00 00 00 A0

*pippo

0x612A0220

12 23 D2 FF

m e m o r i a

0x612A0224

FF 02 41 A4

0x612A0228

21 00 00 00

pippo

0x612A022C

61 2A 02 1C

0x612A0230

12 33 A3 D0

pippo

0x612A0220

(il puntatore stesso) vale...

0x612A021C

0x1223D2FF

(la variabilepuntata da pippo) vale...

*pippo

0x000000A0

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

Cambiare il valore del valorepuntato

00 AA BB 00

*pippo = 0x00AABB00;

variabile

tipo

locazione

pippo

int*

0x612A22C

indirizzo

0x612A0214

00 00 00 FF

0x612A0218

01 22 00 AB

0x612A021C

00 00 00 A0

*pippo

0x612A0220

12 23 D2 FF

m e m o r i a

0x612A0224

FF 02 41 A4

0x612A0228

21 00 00 00

pippo

0x612A022C

61 2A 02 20

0x612A0230

12 33 A3 D0

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

Considerazione sull'efficienza

ide.

tipo

locazione o

valore

int

---

10

I

tabella dei Simboli

del compilatore

---

i

int

0xAA000000

---

ip

int*

0xBB000000

---

x

0xCC000000

int

compilazione

compilazione

compilazione

I è una costante intera (vale 10)

i è una variabile intera

ip è un puntatore ad un intero

const int I=10;

int i;

int*ip;

int x;

...

x = I;

STORE 10 0xCC000000

READ TEMP 0xAA000000

STORE TEMP 0xCC000000

x = i;

READ TEMP0 0xBB000000

READ TEMP1 TEMP0

STORE TEMP1 0xCC000000

x = *ip;

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 assegnamento

Considerazione sull'efficienza: assegnamento

ide.

tipo

locazione o

valore

int

---

10

I

tabella dei Simboli

del compilatore

---

i

int

0xAA000000

---

ip

int*

0xBB000000

(le costanti non si assegnano

-- casomai si inizializzano)

---

x

0xCC000000

int

compilazione

compilazione

I è una costante intera (vale 10)

i è una variabile intera

ip è un puntatore ad un intero

const int I=10;

int i;

int*ip;

int x;

...

I = 15;

i = 15;

STORE 15 0xAA000000

READ TEMP 0xBB000000

STORE 15 TEMP

*ip = 15;

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

Considerazione sull'efficienza: esercizio

accessi alla memoria

in scrittura

accessi alla memoria

in lettura

comando

1

1

1

1

1

1

0

1

2

1

2

3

a = 15;

a = b;

a = *p;

*p = 15;

*p = b;

*p = *p2;

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

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

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 puntatori1

Algebra dei Puntatori

  • Esempi

double *p, *q;

...

q = p + 3;

*(p + 3)=2.0;

q++;

q--;

q+=2;

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 puntatori2

Algebra dei Puntatori

IDEONA !!

equivalenza

puntatori - vettori

Brain Kernighan

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 puntatori3

Algebra dei Puntatori

cartella[3]

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

  • 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,

};

indirizzo

base

di "cartella"

dimensione

cella (=4)

10

21

33

13

4

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 puntatori4

Algebra dei Puntatori

equivalente a

double *p;

...

p[ 5 ]

*(p + 5)

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

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?

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

Puntatori e struct (un pò di zucchero sintattico)

(

)

interpretato

come

*

p.peso

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

p->peso

typedef struct {

char nome[24];

char cognome[24];

int peso;

} Persona;

Persona*p;

...

come accedo al campo peso della Persona puntata da p?

*p.peso

(*p).peso

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

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 == ... )

...

}

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

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!

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


  • Login