• Non ci sono risultati.

Variabili di tipo Puntatore • Le variabili ‘normali’ (NON puntatore) contengono il valore di un’informazione

N/A
N/A
Protected

Academic year: 2021

Condividi "Variabili di tipo Puntatore • Le variabili ‘normali’ (NON puntatore) contengono il valore di un’informazione"

Copied!
8
0
0

Testo completo

(1)

Elementi di Informatica 32 Prof. G. A. Di Lucca - Univ. del Sannio

Variabili di tipo Puntatore

• Le variabili ‘normali’ (NON puntatore) contengono il valore di un’informazione

area 128

nome della variabile locazione di memoria valore della variabile

• Un puntatore è una variabile il cui valore è un indirizzo di una locazione di memoria

Puntatori

• Un puntatore contiene l’indirizzo della locazione di memoria assegnata ad una variabile (che conterrà i valori di tale variabile).

• Si dice che il puntatore ‘punta’ la variabile allocata a quell’indirizzo

128 area

• areaptr nome della variabile

puntatore nome della variabile

valore della variabile

locazione di memoria

(2)

Elementi di Informatica 34 Prof. G. A. Di Lucca - Univ. del Sannio

Puntatori

nome della variabile puntatore

nome della variabile puntata

valore della variabile indirizzo di memoria

128 area

3254 7236

areaptr 7236

Puntatori

• I puntatori (pointer) sono “type bound” cioè ad ogni puntatore è associato il tipo della variabile cui il puntatore si riferisce.

• In C, nella dichiarazione di un puntatore bisogna specificare un asterisco (*) davanti al nome della variabile pointer.

• Esempio:

– int *pointer; // puntatore ad una variabile intera

– char *puntcar; // puntatore ad una variabile carattere

– float *fltpnt; // puntatore ad una variabile float

(3)

Elementi di Informatica 36 Prof. G. A. Di Lucca - Univ. del Sannio

Inizializzazione di puntatori

• Prima di poter usare un puntatore questo deve essere inizializzato, assegnandogli l’indirizzo di memoria di una variabile

• i valori 0 oppure NULL (NULL è preferito) inizializzano un puntatore ad un valore nullo (non puntano a nessuna locazione)

• per assegnare l’indirizzo di memoria di una variabile ad un puntatore è usato l’operatore unario & , address operator

• & (address operator)

• fornisce l’indirizzo di memoria di una variabile

int y = 5; // dichiara la variabile y e le assegna il valore 5 int *yPtr; // dichiara puntatore ad interi yPtr

yPtr = &y; //a yPtr è assegnato l’indirizzo di memoria di y

• yPtr “punta a” y

Inizializzazione e uso di puntatori

yPtr

y

5 540000

Eseguendo yPtr=&y l’indirizzo di y è assegnato a yPtr

yPtr

500000

y

540000 5

indirizzo di indirizzo di

(4)

Elementi di Informatica 38 Prof. G. A. Di Lucca - Univ. del Sannio

• *

(operatore di indirezione o deferimento)

– Restituisce un alias o sinonimo di ciò che il suo operando punta – con riferimento all’esempio precedente (yPtr = &y;)

*yPtr si riferisce il valore di y (perchè yPtr punta a y)

A=*yPtr; // assegna alla variabile A il valore di y, variabile // ‘puntata’ da *Ptr, ovvero A=5

– l’operatore * può essere usato per assegnare un valore alla variabile puntata

*yPtr = 7; // assegna il valore 7 alla variabile ‘puntata’ y

Inizializzazione e uso di puntatori

Inizializzazione e uso di puntatori

Esempio:

int volume;

int *vol_ptr = NULL; // dichiara il puntatore *vol_ptr e lo inizializza a NULL

vol_ptr = &volume; // assegna a *vol_ptr l’indirizzo della variabile volume

Il puntatore vol_ptr contiene ora l’indirizzo della variabile volume.

• Si può assegnare un valore all’oggetto puntato da vol_ptr utilizzando l’operatore di indirezione “ * “.

• Eseguendo l’istruzione:

*vol_ptr= 15;

alla variabile volume è ora assegnato il valore 15

(5)

Elementi di Informatica 40 Prof. G. A. Di Lucca - Univ. del Sannio

Inizializzazione ed uso di puntatori int volume, *vol_ptr;

// dichiara il puntatore a *vol_ptr

vol_ptr = &volume;

// assegna a *vol_ptr l’indirizzo di volume

*vol_ptr = 15;

// assegna a volume il valore 15

vol_ptr = &volume; ==> vol_ptr = 3221

*vol_ptr= 15; ==> volume = 15 Fa scrivere il valore 15 nella locazione con indirizzo 3221 assegnata a volume

3221 15

Indirizzi memoria

Locazione di memoria assegnata a volume

Locazione di memoria assegnata a vol_ptr

3221

4345

. . .

Memoria

// Esempio di uso degli operatori & e *

#include <stdio.h>

int main()

{ int a,b; // a e b variabili di tipo intero

int *aPtr; // aPtr puntatore ad una variabile di tipo intero a = 7;

aPtr = &a; // ad aPtr è assegnato l’indirizzo di a, aPtr ‘punta’ ad a // visualizza indirizzo memoria variabile a e valore di aPtr

printf("\n aPtr = &a; \n");

printf("\n Indirizzo di a (formato decimale) = %d \n", &a);

printf(“ Valore di aPtr (formato decimale) = %d \n", aPtr );

Inizializzazione e uso di puntatori

(6)

Elementi di Informatica 42 Prof. G. A. Di Lucca - Univ. del Sannio

L’indirizzo di memoria di a costituisce il valore di aPtr.

aPtr ha il valore di &a indirizzo di memoria di a

L’operatore * restituisce un alias di ciò che punta il suo operando: aPtr punta ad a, quindi *aPtr restituisce il valore di a.

Ovvero a e *aPtr hanno lo stesso valore // visualizza valore variabile a e di *aPtr

printf("\n a = 7; \n\n");

printf( " Valore di a = %d\n", a);

printf( " Valore di *aPtr = %d\n\n", *aPtr );

(7)

Elementi di Informatica 44 Prof. G. A. Di Lucca - Univ. del Sannio

// assegna ad *aPtr un nuovo valore, che diventa il nuovo valore della // variabile ‘puntata’

*aPtr = 24;

printf("\n *aPtr = 24; \n\n");

printf( " Valore di a = %d\n", a);

printf( " Valore di *aPtr = %d\n\n", *aPtr );

La modifica del valore di *aPtr fa modificare allo stesso modo il valore della variabile ‘puntata’.

a e *aPtr hanno sempre lo stesso valore (modificato)

// facciamo ora puntare aPtr alla variabile b cui è assegnato il valore 258 aPtr = &b;

b = 258;

printf("\n aPtr = &b; \n");

printf("\n Indirizzo di b (decimale) = %d \n", &b);

printf(“ Valore di aPtr (decimale) = %d \n", aPtr );

aPtr ha ora il valore di &b

(8)

Elementi di Informatica 46 Prof. G. A. Di Lucca - Univ. del Sannio

printf("\n b = 258; \n\n");

printf( " Valore di b = %d\n", b);

printf( " Valore di *aPtr = %d\n\n", *aPtr );

*aPtr ha ora il valore della variabile b = 258

*aPtr = 826;

printf("\n *aPtr = 826; \n\n");

printf( " Valore di b = %d\n", b);

printf( " Valore di *aPtr = %d\n\n", *aPtr );

} // fine programma

Modificando il valore di

*aPtr cambia anche il valore della variabile

b = 826

Riferimenti

Documenti correlati

Questo equivale a dire che occorre di- mostrare formalmente che il massimo ` e sempre il primo elemento della lista.. Mos- triamo una bozza di dimostrazione

ƒ restituisce un puntatore che contiene l’indirizzo del blocco di memoria allocato, cioè della variabile, la quale sarà quindi accessibile dereferenziando il puntatore. ƒ la

■ Quindi il vero argomento della prima funzione non é la seconda funzione, ma un normale valore, che può avere qualsiasi origine (variabile, espressione ecc...), e in particolare

Definito un tipo e una variabile puntatore a quel tipo si può assegnare al puntatore l'indirizzo mediante il comando:.

Costruire una lista a puntatori di N nodi, tale che ogni nodo contenga un puntatore a un elemento dell’array. (l’i-esimo nodo conterrà il puntatore all’elemento

La misura di una qualunque grandezza fisica (temperatura, concentrazione di una farmaco,..) pu` o essere vista come la somma del valore esatto della grandezza e

Lo spazio allocato a una variabile di tipo puntatore è sempre uguale, indipendentemente dal tipo dell’oggetto puntato.. Il Tipo

● Il valore del puntatore è l'indirizzo di memoria della variabile alla quale punta... Gestione