10: Allocazione dinamica della memoria Vers. 9.1 – Ottobre 2025
Operatore di differenza tra un puntatore ed un intero
Definizione: L ' operazione di sottrazione di un intero da un puntatore prevede un operando sinistro di tipo puntatore e un operando destro di tipo intero. Il risultato( analogamente al caso della somma) di tale operazione è l’ indirizzo dato dal puntatore decrementato del risultato della moltiplicazione dell ' intero specificato per la dimensione del tipo base del puntatore espressa in byte.
Esempio: relativamente allo schema posto a pagina 11, se q è un puntatore al tipo intero INT( q: PUNTATORE A INT) e lo poniamo al valore 1016 e se supponiamo la dimensione di un INT pari quattro byte allora:
q vale 1016 |
( quindi p punterà alla locazione di memoria di indirizzo 1016- 0 * DimensioneDi( INT) = 1016) |
q- 1 vale 1012 |
( quindi p punterà alla locazione di memoria di indirizzo 1016- 1 * DimensioneDi( INT) = 1012) |
q- 2 vale 1008 |
( quindi p punterà alla locazione di memoria di indirizzo 1016- 2 * DimensioneDi( INT) = 1008) |
q- 3 vale 1004 |
( quindi p punterà alla locazione di memoria di indirizzo 1016- 3 * DimensioneDi( INT) = 1004) |
q- 4 vale 1000 |
( quindi p punterà alla locazione di memoria di indirizzo 1016- 4 * DimensioneDi( INT) = 1000). |
Significato dell’ operazione: Nelle stesse condizioni descritte sopra per la somma, l ' operazione di sottrazione di un intero da un puntatore consente di ricavare l ' indirizzo di una cella di un array precedente a quella puntata dal puntatore su cui viene applicata la sottrazione. N. B. Ovviamente in questo caso il puntatore q deve essere inizializzato con il valore dell’ indirizzo dell’ ultimo elemento.
ALGORITMO Array _ Dinamico _ Back PROCEDURA main()
p, q: PUNTATORE A INT n, i: INT
INIZIO /* VERA DINAMICITA ' */ RIPETI
Leggi( n) FINCHE’( n ≥ 1) /* Allocazione area di memoria dimamica */ Alloca( p, n * DimensioneDi( INT))( 1) SE( p ≠ NULL)
ALLORA /* q punta all’ ultimo elemento dell’ array dinamico */ q � p +( n-1)( 2) /* Ciclo di caricamento array dinamico con p */ PER i � 0 A( n – 1) ESEGUI Leggi(*( p + i))( 3) i � i + 1 FINE PER /* Ciclo di visualizzazione array dinamico con q */ PER i � 0 A( n – 1) ESEGUI Scrivi(*( q – i))( 4) i � i + 1 FINE PER /* Deallocazione area di memoria dimamica */ Dealloca( p)( 5) q � NULL
ALTRIMENTI
Scrivi(“ Errore nell’ allocazione!”) FINE SE RITORNA FINE
( 5)
( 1) p
( 3) n elementi
( 2)
0000111 110100010010100101010 1101010 001000101101010101010 0010110 100101110111110101010 0010101 111110100101111010101 1101101 110101110101011101011 q
Segmento Heap
Segmento stack
Segmento dati
Segmento codice
Autore: Rio Chierego( email: riochierego @ libero. it- sito web: www. riochierego. it) Pag. 19