Laboratorio di linguaggi lezione v puntatori 1 3
Download
1 / 23

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


  • 99 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.

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

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


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

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

  • 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

" 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

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

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

*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

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

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

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

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

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

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)

(

)

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

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

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