CodeGym /Corsi /JAVA 25 SELF /Indirizzamento della memoria e variabili

Indirizzamento della memoria e variabili

JAVA 25 SELF
Livello 2 , Lezione 4
Disponibile

1. Struttura della memoria

Ogni computer ha la memoria RAM. Che cos’è, quali proprietà ha e, soprattutto, che utilità ne ricaviamo?

Ogni programma (inclusi i programmi scritti in Java) prima dell’esecuzione viene caricato nella memoria RAM. Nella memoria RAM si trovano il codice del programma (che viene eseguito dal processore) e i dati del programma (che il programma stesso colloca in memoria).

Che cos’è dunque la memoria RAM e a cosa assomiglia?

Immagina Excel 😎 Un foglio di Excel è composto da celle, e ogni cella ha il suo numero univoco (A1, A2, ... B1, B2). Conoscendo il numero della cella, è sempre possibile scriverci un valore oppure ottenere il valore che vi è memorizzato. La memoria del computer è organizzata in modo simile.

memory-excel

Il programma e i suoi dati durante l’esecuzione sono memorizzati nella memoria. Tutta la memoria del computer è rappresentata come piccole celle – byte. Ogni cella ha il suo numero univoco – 0, 1, 2, 3, ... (la numerazione inizia da zero). Conoscendo il numero della cella, possiamo salvare in quella cella dei dati, oppure prelevarli. In alcune celle è memorizzato il codice del programma – un insieme di istruzioni per il processore, in altre – i dati del programma. Il numero della cella viene anche chiamato indirizzo della cella.

Il processore sa eseguire istruzioni del programma caricato in memoria. Quasi tutte le istruzioni del processore sono qualcosa come: prendere i dati da alcune cellefarci qualcosa → collocare il risultato in altre celle.

Combinando centinaia di istruzioni semplici, otteniamo istruzioni complesse e utili.

Quando nel codice del programma si dichiara una variabile, le viene assegnata una porzione di memoria non ancora utilizzata. Di solito sono alcuni byte. Al momento della dichiarazione è obbligatorio indicare il tipo di informazione che il programma memorizzerà nella variabile: numeri, testo o altri dati. Senza conoscere il tipo di informazione non è chiaro di quale dimensione debba essere il blocco di memoria da assegnare alla variabile.

Agli albori dell’informatica i programmi lavoravano direttamente con i numeri delle celle di memoria, ma in seguito, per comodità dei programmatori, si è cominciato ad attribuire nomi alle celle. Il nome univoco della variabile serve innanzitutto alla comodità dei programmatori: durante l’esecuzione, il programma se la caverebbe benissimo anche solo con i numeri.

2. Variabili in memoria

In Java ci sono 4 tipi principali di dati per memorizzare numeri interi: byte, short, int e long.

Tipo Dimensione, byte Origine del nome
byte
1
Byte, perché occupa un byte di memoria
short
2
Abbreviazione di Short Integer
int
4
Abbreviazione di Integer
long
8
Abbreviazione di Long Integer

Inoltre in Java ci sono 2 tipi a virgola mobile — float e double:

Tipo Dimensione, byte Origine del nome
float
4
Abbreviazione di Floating Point Number
double
8
Abbreviazione di Double Float

Ogni volta che l’esecuzione del programma arriva all’istruzione di creazione di una variabile, le viene assegnata una piccola area di memoria (la dimensione dipende dal tipo della variabile).

Importante!

Per indirizzo della variabile si intende l’indirizzo della prima cella del blocco di memoria assegnato ad essa.

Ai programmi Java è vietato accedere direttamente alla memoria. Tutto il lavoro con la memoria avviene solo tramite la Java Virtual Machine.

3. Il tipo String in memoria

Il tipo String può contenere grandi quantità di dati, quindi non è semplicemente un tipo di dato, ma un oggetto a tutti gli effetti.

I dati del tipo String (testo) sono collocati in un oggetto speciale, per il quale viene allocata memoria, e l’indirizzo di questo oggetto viene memorizzato nella variabile, per la quale a sua volta viene allocata memoria.

memory-string

  • La variabile a di tipo int occupa 4 byte e memorizza il valore 1.
  • La variabile b di tipo int occupa 4 byte e memorizza il valore 10,555. La virgola non è la parte frazionaria del numero, ma la separazione delle migliaia. La parte frazionaria è separata dal punto.
  • La variabile d di tipo double occupa 8 byte e memorizza il valore 13.001.
  • La variabile str di tipo String memorizza il valore D12 — l’indirizzo della prima cella dell’oggetto che contiene il testo.

L’oggetto di tipo String (che contiene il testo) è memorizzato in un blocco di memoria separato. L’indirizzo della sua prima cella è memorizzato nella variabile str.

4. Cosa succede quando assegnamo

Un’altra cosa importante — come funziona l’assegnazione. Per esempio:

int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10

In questo esempio in memoria vengono create due celle: una per a, una per b. Quando scriviamo b = a;, si copia il valore (10), non la «scatola» stessa. Le modifiche in b non influenzano in alcun modo a.

Ora in modo analogo, ma con le stringhe:

String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1); // "Hello"
System.out.println(s2); // "Hello World"

Qui entrambe le variabili s1 e s2 fanno riferimento alla stessa stringa "Hello" fino al momento della modifica. Ma quando eseguiamo s2 = s2 + " World";, per s2 viene creata una nuova stringa "Hello World", mentre s1 continua a puntare alla vecchia stringa "Hello".

5. Perché in programmazione si conta da zero

Spesso ci si sorprende del fatto che in programmazione quasi ovunque si inizi a contare da zero. Il punto è che ci sono molte situazioni in cui contare da zero è più comodo (anche se ci sono situazioni in cui è più comodo contare da 1).

Proviamo a pensare a un’analogia. Sei in una lunga coda in un negozio. Il cassiere dice che tutti i clienti, a partire dal 20°, vadano alla seconda cassa. Quali numeri avranno? 20, 21, 22, 23, ... Logico. E rispetto al ventesimo? 0, 1, 2, 3, ...

Quando definiamo un gruppo come «numero del primo elemento» + «quantità», all’interno del gruppo i numeri relativi risultano +0, +1, +2, ...

In programmazione è la stessa cosa. Se alla tua variabile sono stati assegnati 100 byte di memoria e hai X – l’indirizzo del primo byte, quali saranno gli indirizzi di tutti i byte? X+0, X+1, X+2, ..., X+99. Abbiamo così ottenuto un gruppo di byte con indici 0, 1, 2, 99.

Quando pensiamo a un indirizzo relativo all’interno di un qualsiasi blocco di dati, otteniamo sempre una numerazione a partire da zero. Questa è la prima e più comune ragione del conteggio da zero.

1
Compito
JAVA 25 SELF, livello 2, lezione 4
Bloccato
Profilo del personaggio di gioco 🎮
Profilo del personaggio di gioco 🎮
1
Compito
JAVA 25 SELF, livello 2, lezione 4
Bloccato
Copia e modifica dei dati del progetto 📝
Copia e modifica dei dati del progetto 📝
1
Compito
JAVA 25 SELF, livello 2, lezione 4
Bloccato
Dimensioni dei dati 📊
Dimensioni dei dati 📊
1
Compito
JAVA 25 SELF, livello 2, lezione 4
Bloccato
Conti diversi in banca 🏦
Conti diversi in banca 🏦
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION