• Non ci sono risultati.

Indirizzi e puntatori

N/A
N/A
Protected

Academic year: 2021

Condividi "Indirizzi e puntatori"

Copied!
19
0
0

Testo completo

(1)

Indirizzi e puntatori

Andrea Marin

Universit`a Ca’ Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

a.a. 2011/2012

(2)

Richiami sulle variabili

I Una variabile `e costituita da una o pi`u locazioni di memoria (a seconda del tipo)

I int a;: 2 Byte (tipicamente)

I float b;: 4 Byte

I char str[100]; : 100 Byte

I Nella macchina virtuale ogni locazione di memoria `e

individuata da un indirizzo, cio`e un numero progressivo che la identifica

I Intuitivamente, l’accesso ad una variabile potrebbe avvenire in due modi:

I Tramite il nome

I Tramite l’indirizzo

(3)

Ottenere l’indirizzo di una variabile

I Per ottenere l’indirizzo di una variabile si usa l’operatore &

I Esempio:

I Consideriamo la dichiarazione int a

I L’indirizzo del primo Byte allocato per la variabile a pu`o essere ottenuto mediante l’espressione &a

I Il tipo dell’espressione &a `e int*

I Altro esempio:

I float c;

I Il tipo dell’espressione &c `e float*

I type* `e un tipo che si pu`o leggere come indirizzo di una variabile di tipo type

(4)

Puntatori

Definition (Puntatore)

Un puntatore in C `e una variabile il cui valore `e un indirizzo di memoria.

I La dichiarazione di un puntatore pa ad un tipo type:

I type *pa;

I Esempio:

i n t ∗ pa ; i n t a ; a = 1 0 ; pa = &a ;

/∗ I l v a l o r e d i pa e l ’ i n d i r i z z o d e l p r i m o ∗/

/∗ b y t e r i s e r v a t o p e r l a v a r i a b i l e a ∗/

(5)

Esempio: visione grafica

(6)

Operazione di dereferenziazione

I Diciamo che un puntatore referenzia una locazione di memoria (a pointer references a memory location)

I L’operazione di dereferenziazioneconsiste nell’accedere alla cella di memoria referenziata

I Nell’esempio precedente la dereferenziazione del puntatore pa

`

e la cella in cui `e allocata la variabile chiamata a perch`e il valore della variabile pa `e l’indirizzo di a

I Quando si dereferenzia un puntatore di tipo type* si ottiene unavariabile di tupo type

(7)

Come si effettua la dereferenziazione

Se pa `e di tipo type* la dereferenziazione si ottiene con *pa che indica la locazione di memoria di tipo type referenziata dal puntatore pa

f l o a t x ; f l o a t y ; f l o a t ∗ p f ;

i n t main ( ) { p f = &x ; x = 1 2 . 3 ; y = ( ∗ p f ) + 1 ; y = y + 5 ;

∗ p f = ( ∗ p f ) + 1 . 2 ;

p r i n t f ( ‘ ‘ % f %f %f ’ ’ , x , y , p f ) ; r e t u r n 0 ;

}

(8)

Esempio/1

(9)

Esempio/2

(10)

Esempio/3

(11)

Esempio/4

(12)

Esempio/5

(13)

Aritmetica dei puntatori: differenza

I Siano pa e pb due puntatori di tipo type*

I pb - pa `e un’espressioneche indica quanti oggetti di tipo type sono possono essere compresi tra l’indirizzo

memorizzato in pa e quello memorizzato in pb

I Il risultato pu`o essere anche negativo

(14)

Aritmetica dei puntatori: confronti

I Siano pa e pb due puntatori di tipo type*

I pa == pb `e un’espressione che codifica true se i puntatori pa e pb contengono lo stesso indirizzo, false altrimenti

I pa > pb `e un’espressione che codifica true se l’indirizzo contenuto in pa `e maggiore di quello contenuto in pb

(15)

Attenzione!

i n t a , b , c ;

i n t ∗ pa , ∗ pb , ∗ pc , ∗ pd ; . .

a = 7 ; c = 7 ;

pa = &a ; pc = &c ; pd = pc ;

I pa == pc ⇒ false

I *pa == *pc ⇒ true

I pd == pc ⇒ true

(16)

Aritmetica dei puntatori: somme/sottrazioni con int

I Sia pa un puntatore di tipo type*

I Sia exp un’espressione di tipo int

I Allora pa + exp `e un’espressione di tipo type* il cui valore `e l’indirizzo di memoria contenuto in pa aumentato di un numero di dimensioni di type pari al valore di exp

I Il meccanismo `e molto utile per la gestione degli array

(17)

Esempio d’uso di aritmetica dei puntatori per la gestione degli array

f l o a t v e c t [ DIM ] ;

i n t main ( ) {

/∗ L e g g i v e c t ∗/

f l o a t ∗ pc ;

/∗ Pc s c o r r e l ’ a r r a y d a l p r i m o e l e m e n t o i l c u i i n d i r i z z o e &v e c t [ 0 ] f i n o a l l ’ u l t i m o i l c u i i n d i r i z z o e &v e c t [ 0 ] + DIM ∗/

f o r ( pc = &v e c t [ 0 ] ; pc < &v e c t [ 0 ] + DIM ; pc = pc +1) {

∗ pc = ( ∗ pc ) / 2 . 0 ; }

. . }

(18)

Puntatori a puntatori

I Un puntatore di tipo type* pu`o contenere l’indirizzo di una variabile di tipo type

I Il tipo type pu`o a sua volta essere un puntatore

I Possiamo scrivere:

i n t x ; i n t ∗ px ; i n t ∗∗ ppx ; . .

ppx = &px ; px = &x ;

I x, *px, **ppx denotano tutti la stessa locazione di memoria

(19)

Riferimenti

Documenti correlati

P.Iva: 03740270164 Sede Legale: Via S.Bernardino, 139/E - Bergamo (BG) Sede Operativa: Via Fratelli Galliari, 26 - 24047 Treviglio (BG) www.laboratoriodiarchitettura.net

• L’Italia è il quarto paese nell’Ue in materia di open data, mentre si posiziona all’ottavo posto per quanto riguarda i servizi di sanità digitale, il 24% degli italiani

Attività Sviluppare le conoscenze digitali trasversali dei dipendenti pubblici in tema di cittadinanza digitale, e-government e open government. Sviluppare la e-leadership e

Webinar - Nuovo giornalismo pubblico e uso dei social media nella Pubblica Amministrazione... L’uso di

● Il sistema camerale piemontese nel 2012 ha adottato un unico modello per le diverse Camere di commercio della Regione, su iniziativa della CCIAA di Torino. ● 6 Camere di

Punti di forza e di debolezza del sito web analizzato e benchmark Individuazione delle linee d’intervento migliorative. Buone pratiche trasferibili ad altre amministrazioni

•  Con riguardo alla distribuzione dei rispondenti per tipo di PA, sono i dirigenti delle PA “Altre” quelli che avvertono di più il fenomeno (36,1%), seguiti da quelli

161 del 09.02.2016 del Direttore Generale dell’Indire, al quale si fa integrale rinvio, con cui si è stabilito di dare avvio alla selezione pubblica mediante procedura comparativa