Una variabile è un costrutto logico che va all'intento di un algoritmo, mentre una posizione di memoria è un costrutto fisico che descrive il funzionamento di un computer. In generale, per eseguire un programma esiste una mappatura (generata dal compilatore) tra la nozione logica di una variabile e la memoria del computer.
(Anche nel linguaggio assembly abbiamo una nozione di variabili (logiche) che vanno all'algoritmo e all'intento e posizioni di memoria (fisica), sebbene siano più concentrate nell'assemblaggio.)
Una variabile è un concetto di alto livello (er). Una variabile rappresenta uno sconosciuto (come in matematica o un incarico di programmazione) o un segnaposto che può essere sostituito con un valore (come nella programmazione: parametri).
Una posizione di memoria è un concetto di basso livello (er). Una posizione di memoria può essere utilizzata per memorizzare un valore, a volte, per memorizzare il valore di una variabile. Tuttavia, un registro CPU è un altro modo per memorizzare il valore di alcune variabili. I registri della CPU sono anche posizioni di archiviazione di basso livello, ma non sono posizioni di memoria in quanto non hanno indirizzi, ma solo nomi.
In un certo senso, una variabile è un meccanismo di astrazione per esprimere l'intento del programma, mentre una posizione di memoria è un'entità fisica dell'ambiente di elaborazione che fornisce archiviazione e recupero.
Domanda 003: è vero che un puntatore è memorizzato nella posizione di memoria 0x23452? Perché?
Non possiamo dirlo per certo. Solo perché esiste un valore che funzionerebbe come indirizzo, non significa che sia quell'indirizzo, potrebbe invece essere l'intero (decimale) 144466. Non possiamo fare ipotesi sull'interpretazione dei valori semplicemente basandoci su come appaiono numericamente.
Domanda 004: è vero che un puntatore è memorizzato nella posizione di memoria 0x23452? Perché?
Questa è davvero una domanda strana. Si aspettano alcune ipotesi basate sulle caselle, tuttavia, notiamo che gli indirizzi aumentano di 1 per ogni casella. In qualsiasi computer moderno, ciò significherebbe che ogni casella può contenere un indirizzamento byte - byte è ormai la norma da decenni. Tuttavia un byte ha solo 8 bit e può variare da 0 a 255 (per valori senza segno); tuttavia mostrano un valore molto più grande memorizzato in uno di questi indirizzi, quindi molto sospetto. (Questo potrebbe funzionare se questa fosse una macchina indirizzata a parole, ma non lo dice, e oggi lo sono poche macchine, sebbene alcune macchine educative lo siano.)
Sulla base delle quattro flashcard che ho mostrato a tutti, definirei i puntatori in un modo leggermente diverso:
Un puntatore è una posizione di memoria il cui valore è l'indirizzo di memoria di un'altra posizione di memoria.
Mentre ci sono situazioni in cui questo pensiero è corretto, qui stai mescolando metafore. La nozione di una variabile va all'algoritmo e al suo intento: non è necessario supporre che tutte le variabili abbiano posizioni di memoria. Alcune variabili (in particolare gli array) hanno posizioni di memoria perché le posizioni di memoria supportano l'indirizzamento (mentre i registri della CPU possono solo essere nominati non indicizzati).
Per l'esecuzione, esiste una mappatura logica tra variabili e istruzioni, posizioni della memoria del processore e sequenze delle istruzioni del processore. Una variabile il cui valore non cambia mai (ad esempio una costante) non richiede nemmeno necessariamente una posizione di memoria, poiché il valore può essere riprodotto a piacimento (ad esempio, se necessario per le sequenze di codici generate dal compilatore).
a
,0x23453
.nil
ecc. roba al loro interno sono i valori. Potrebbe sembrare ovvio per te, ma non mi farebbe comodo dare risposte decisive a quelle domande senza vedere come sono definiti quei campi. Non c'è davvero modo di sapere sea
nella seconda immagine c'è un carattere, una stringa (se sono diversi) o il nome di una variabile. Se è una stringa, allora ènil
anche una stringa? O un valore "nullo"?