laboratorio di linguaggi lezione v puntatori 1 3
Download
Skip this Video
Download Presentation
Laboratorio di Linguaggi lezione V: puntatori (1/3)

Loading in 2 Seconds...

play fullscreen
1 / 23

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


  • 110 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Laboratorio di Linguaggi lezione V: puntatori (1/3)' - damali


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

+

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

ad