Perché parliamo degli indirizzi e della memoria della variabile in C?

2

Perché usiamo parlare di indirizzi e memoria della variabile in C, dove in altri linguaggi (come in Java, .Net etc) non parliamo di indirizzo e memoria variabili in un programma, useremo direttamente le variabili .

Ma in C Language stiamo ascoltando la parola address e memory.

Come spiegarlo?

Spero che C sia un linguaggio di alto livello progettato sul linguaggio assembly. Quindi C è uno strato sottile sul linguaggio assembly (nel linguaggio assembly useremo le posizioni di memoria per memorizzare una variabile e tenere traccia di una variabile). Ma in altre lingue questi indirizzi e le cose relative alla memoria sono avvolti in quel linguaggio specifico, così che non ascolteremo queste parole.

    
posta user2720323 06.11.2013 - 10:00
fonte

4 risposte

11

Contrariamente a ciò che chiunque direbbe, sapere come funziona la memoria è importante sapere per qualsiasi lingua, indipendentemente dal fatto che una lingua specifica richieda di conoscerla. Per linguaggi di basso livello come C, gli indirizzi di memoria sono molto importanti da sapere perché dedicare spazio agli array o alle strutture di dati complesse richiede un atto fisico di chiedere al sistema operativo uno spazio di memoria della dimensione appropriata e tu, il programmatore, devi essere in grado di sapere quanti byte sono necessari C offre metodi utili a questo riguardo come sizeof, ma non pretende di nasconderlo da te.

Solo recentemente C ++ ha spostato verso la rimozione della responsabilità per i programmatori di liberare la memoria allocata avendo puntatori intelligenti. C # e Java sono abbastanza bravi a nasconderlo, ma sono ancora lì. Ad esempio in Java, se confronti due oggetti con == , stai confrontando i loro puntatori. Potresti non conoscere i valori del puntatore, ma devi capire che se due oggetti restituiscono true utilizzando l'operatore == , condividono lo stesso spazio in memoria. Se non hai capito questo concetto, potresti fare cose come confrontare le stringhe con == , che potrebbe darti quello che ti aspetti, ma forse no. Poiché "mickey mouse" == "mickey mouse" può o non può condividere lo stesso indirizzo di memoria a seconda di come è implementato nella macchina virtuale, i programmatori Java non dovrebbero mai eseguire tali controlli usando == , ma piuttosto con .equals() , a meno che, naturalmente, non verifichi effettivamente condividono la stessa memoria è ciò che vuoi.

Ovviamente questo è solo un esempio. Con l'aumento della memoria e i progressi della tecnologia, la gestione della memoria diventerà meno importante con il tempo. Tuttavia ti assicuro che l'unico giorno in cui il tuo programma sta consumando più memoria possibile e il tuo capo ti sta controllando per sistemarlo, la modalità di gestione della memoria diventa molto rilevante molto velocemente. :)

    
risposta data 06.11.2013 - 10:54
fonte
5

Lo scopo originale di C era implementare un sistema operativo (Unix); parte del lavoro di un sistema operativo è la gestione delle risorse di memoria, quindi la lingua necessaria per esporre gli indirizzi di memoria e le operazioni su quegli indirizzi al programmatore.

I progettisti di Java e C # hanno deciso di non esporre i tipi di indirizzo e le operazioni al programmatore per una serie di motivi: sicurezza, modello di memoria più semplice (almeno dal punto di vista dei programmatori), garbage collection, ecc. molte lingue più vecchie (Fortran, Cobol, BASIC vecchia scuola, ecc.) non espongono gli indirizzi, almeno non direttamente.

E, per chiarire un equivoco popolare, C non è semplicemente un sottile strato sopra l'assemblea; è un linguaggio di alto livello come Java, fornisce solo astrazioni di basso livello . Parte di questo è soddisfare il mandato che C sia facile da implementare . Far sì che il programmatore abbia a che fare con la sua gestione della memoria semplifica un po 'la lingua. Questo è il motivo per cui C non fornisce un insieme di tipi di contenitori standard o un tipo di stringa reale che cresce e si restringe se necessario. Mantenendo la lingua e il toolkit semplici, i compilatori C possono scegliere una vasta gamma di piattaforme che le altre lingue non hanno.

    
risposta data 06.11.2013 - 17:44
fonte
1
  • Non c'era un garbage collector per C. Se non c'è GC allora i programmatori devono allocare / deallocare la memoria da soli. Una buona esempio è Objective-C, che fino a quando non ha ottenuto un GC, i programmatori lo sono responsabile della gestione dell'uso della memoria.
  • C'era un puntatore prima dei riferimenti. È come un riferimento, ma puoi indicarlo dove preferisci, quindi non c'era sicurezza.
  • Trasmissione di tipo liberale, puoi allocare un tipo di dati e trattarlo come uno spazio in memoria o un altro tipo di tipo di dati.
risposta data 06.11.2013 - 23:54
fonte
1

But in C Language we are listening the word address and memory.

How to explain this?

Perché i computer usano gli indirizzi e la memoria. Il linguaggio C è progettato per essere utilizzato sui computer, in cui la definizione formale di un computer è qualcosa con una CPU, una memoria e alcuni I / O. In altre parole, non necessariamente un PC desktop. E quindi per diventare un programmatore C mezzo decente, devi sapere cos'è un computer e come funziona.

I linguaggi di livello superiore hanno nascosto questo, per consentire la programmazione per le persone che non sanno nulla di computer, in modo che possano concentrarsi sulla scrittura di applicazioni e algoritmi, senza sapere cosa succede tra le righe.

Molti linguaggi di alto livello vengono eseguiti su una macchina virtuale, che è essenzialmente un altro programma scritto in un linguaggio di livello inferiore, con lo scopo di eseguire gli script o il codice byte generato dal linguaggio di alto livello. Ma alla fine, tutti i programmi eseguiti utilizzano in ultima analisi gli indirizzi e risiedono nella memoria.

    
risposta data 08.11.2013 - 11:12
fonte

Leggi altre domande sui tag