4° Anno TEORIA 2. Allocazione dinamica della memoria | Page 19

10 : Allocazione dinamica della memoria Vers . 8.3 – Ottobre 2023
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
// Utilizzando il linguaggio C – Array _ Dinamico _ Back
Autore : Rio Chierego ( email : riochierego @ libero . it - sito web : www . riochierego . it ) Pag . 19