Classi di archiviazione in C: Auto, Extern, Static, Register (Esempi)

⚡ Riepilogo intelligente

In C, le classi di archiviazione definiscono l'ambito, la durata, il valore predefinito e la posizione in memoria di ogni variabile, utilizzando quattro specificatori — auto, register, static ed extern — per controllare dove risiedono i dati e per quanto tempo persistono durante l'esecuzione.

  • 🗂️ Quattro classi di archiviazione: Il linguaggio C fornisce gli specificatori auto, register, static ed extern per descrivere ogni variabile.
  • 🏠 Auto: La classe locale predefinita, confinata al suo blocco e contenente un valore casuale finché non le viene assegnato un valore.
  • Registrare: Richiede spazio di archiviazione nei registri della CPU per un accesso più rapido alle variabili utilizzate di frequente, come i contatori.
  • ♻️ Statico: Mantiene un valore variabile tra le chiamate di funzione e, al primo utilizzo, il suo valore predefinito è zero.
  • 🌐 Esterno: Consente di condividere una variabile o una funzione globale tra più file sorgente senza doverla ridefinire.
  • 📊 Ambito e durata: Ogni classe definisce dove una variabile è visibile e per quanto tempo rimane visibile.

Classi di stoccaggio in C

Cos'è la classe di archiviazione in C?

Una classe di archiviazione rappresenta la visibilità e la posizione di una variabile. Indica da quale parte del codice possiamo accedere a una variabile. Una classe di archiviazione in C è usata per descrivere le seguenti cose:

  • L'ambito variabile.
  • La posizione in cui verrà archiviata la variabile.
  • Il valore inizializzato di una variabile.
  • Una vita di una variabile.
  • Chi può accedere a una variabile?

Pertanto una classe di archiviazione viene utilizzata per rappresentare le informazioni su una variabile.

NOTA: Una variabile non è associata solo a un tipo di dati, il suo valore ma anche una classe di archiviazione.

Quali sono i tipi di classi di archiviazione in C?

Esistono in totale quattro tipi di classi di archiviazione standard. La tabella seguente rappresenta le classi di archiviazione in C.

Classe di archiviazione Missione
auto È una classe di archiviazione predefinita.
esterno È una variabile globale.
statico È una variabile locale che è in grado di restituire un valore anche quando il controllo viene trasferito alla chiamata della funzione.
registro È una variabile che viene memorizzata all'interno di un registro.

Classe di stoccaggio automatico in C

Le variabili definite utilizzando la classe di archiviazione automatica sono chiamate variabili locali. Auto sta per classe di memorizzazione automatica. Una variabile è nella classe di archiviazione automatica per impostazione predefinita se non è specificata esplicitamente.

L'ambito di una variabile automatica è limitato solo al blocco particolare. Una volta che il controllo esce dal blocco, l'accesso viene distrutto. Ciò significa che solo il blocco in cui è dichiarata la variabile auto può accedervi.

Una parola chiave auto viene utilizzata per definire una classe di archiviazione automatica. Per impostazione predefinita, una variabile auto contiene un valore spazzatura.

Example, auto int age;

Il programma seguente definisce una funzione con due variabili locali

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

Prendiamo un altro programma che mostra il livello di visibilità "livello di visibilità" per le variabili automatiche in ciascun codice di blocco che sono indipendenti l'una dall'altra:

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

Produzione:

 3 2 1

Classe di archiviazione esterna in C

Extern sta per classe di archiviazione esterna. La classe di archiviazione esterna viene utilizzata quando disponiamo di funzioni o variabili globali condivise tra due o più file.

La parola chiave `extern` viene utilizzata per dichiarare una variabile o una funzione globale in un altro file, in modo da fornire un riferimento alla variabile o alla funzione già definita nel file originale.

Le variabili definite utilizzando una parola chiave extern sono chiamate variabili globali. Queste variabili sono accessibili in tutto il programma. Si noti che la variabile extern non può essere inizializzata poiché è già stata definita nel file originale.

Example, extern void display();

Primo file: main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

Secondo file: originale.c

#include <stdio.h>
i=48;

Risultato:

 value of the external integer is = 48

Per compilare ed eseguire il codice sopra, seguire i passaggi seguenti

Passaggio 1) Creare un nuovo progetto,

  • Seleziona Applicazione console
  • Fai clic su Vai

Crea un nuovo progetto in Code Blocchi

Passaggio 2) Selezionare C e fare clic su Avanti

Seleziona il linguaggio C

Passaggio 3) Fare clic su Avanti

Fare clic su Avanti

Passaggio 4) Inserisci i dettagli e fai clic su Avanti

Inserisci i dettagli del progetto

Passaggio 5) Fare clic su Fine

Fai clic su Fine

Passaggio 6) Inserisci il codice principale come mostrato nel programma precedente nel file main.c e salvalo.

Aggiungi il codice a main.c

Passaggio 7) Creare un nuovo file C [File -> Nuovo -> File vuoto, salvarlo (come original.c) e aggiungerlo al progetto corrente facendo clic su "OK" nella finestra di dialogo.

Crea il file original.c

Passaggio 8) Inserire e salvare il codice C del file original.c mostrato nell'esempio precedente, senza la funzione main().

Aggiungi il codice al file original.c

Passaggio 9) Compila ed esegui il tuo progetto. Il risultato è mostrato nella figura successiva.

Output del programma

Classe di archiviazione statica in C

Le variabili statiche vengono utilizzate all'interno della funzione/file come variabili statiche locali. Possono anche essere usati come a variabile globale

  • La variabile locale statica è una variabile locale che conserva e memorizza il proprio valore tra chiamate di funzione o blocco e rimane visibile solo alla funzione o al blocco in cui è definita.
  • Le variabili globali statiche sono variabili globali visibili solo al file in cui sono dichiarate.
Example: static int count = 10;

Tieni presente che la variabile statica ha un valore iniziale predefinito pari a zero e viene inizializzata solo una volta nella sua vita.

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

Risultato:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

Le variabili globali sono accessibili in tutto il file mentre le variabili statiche sono accessibili solo alla parte particolare di un codice.

La durata di una variabile statica è contenuta nell'intero codice del programma. Una variabile dichiarata o inizializzata utilizzando la parola chiave statica contiene sempre zero come valore predefinito.

Registrare la classe di archiviazione in C

È possibile utilizzare la classe di archiviazione dei registri quando si desidera archiviare variabili locali all'interno di funzioni o blocchi nei registri della CPU anziché RAM per avere un rapido accesso a queste variabili. Ad esempio, i “contatori” sono un buon candidato per essere archiviati nel registro.

Example: register int age;

La parola chiave `register` viene utilizzata per dichiarare una classe di memorizzazione registri. Le variabili dichiarate utilizzando la classe di memorizzazione registri hanno una durata pari a quella dell'intero programma.

È simile alla classe di archiviazione automatica. La variabile è limitata al blocco particolare. L'unica differenza è che le variabili dichiarate utilizzando la classe di archiviazione dei registri sono archiviate nei registri della CPU anziché in una memoria. Il registro ha un accesso più veloce di quello della memoria principale.

Le variabili dichiarate utilizzando la classe di archiviazione del registro non hanno un valore predefinito. Queste variabili vengono spesso dichiarate all'inizio di un programma.

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

Produzione:

error: address of register variable 'weight' requested

La tabella successiva riassume le caratteristiche principali di ciascuna classe di archiviazione comunemente utilizzata nella programmazione C

Classe di stoccaggio Dichiarazione Archiviazione Valore iniziale predefinito Obbiettivo Per sempre.
auto All'interno di una funzione/blocco Memorie Imprevedibile All'interno della funzione/blocco All'interno della funzione/blocco
registro All'interno di una funzione/blocco Registri della CPU Spazzatura All'interno della funzione/blocco All'interno della funzione/blocco
esterno Fuori da tutte le funzioni Memorie Zero Intero il file e altri file in cui la variabile è dichiarata come extern tempo di esecuzione del programma
Statico (locale) All'interno di una funzione/blocco Memorie Zero All'interno della funzione/blocco tempo di esecuzione del programma
Statico (globale) Fuori da tutte le funzioni Memorie Zero Global tempo di esecuzione del programma

DOMANDE FREQUENTI

L'ambito di visibilità di una variabile determina dove essa è visibile nel codice, mentre la durata di vita ne determina per quanto tempo rimane in memoria. Una variabile può avere ambito di blocco ma una durata di vita pari all'intero programma.

Entrambi creano variabili locali con ambito di blocco, ma auto le mantiene in memoria con un valore predefinito casuale, mentre register richiede una memoria più veloce nei registri della CPU e impedisce di ottenere l'indirizzo della variabile.

No. La parola chiave `register` è solo una richiesta; il compilatore può ignorarla quando non ci sono registri liberi. I compilatori moderni ottimizzano automaticamente l'uso dei registri, quindi questa parola chiave è ormai raramente necessaria.

Le variabili statiche ed esterne risiedono in un segmento di memoria inizializzato a zero per l'intero programma, quindi iniziano da zero. Le variabili automatiche riutilizzano la memoria dello stack, mantenendoping qualunque valore fosse rimasto indietro.

Una dichiarazione extern si limita ad annunciare una variabile definita altrove e non può essere inizializzata. La definizione effettiva, in un file separato, alloca lo spazio di memoria e il collegamento simbolico connette ogni riferimento ad essa.

In gran parte sì, ma non del tutto. C++ ha deprecato la parola chiave register e ha riutilizzato auto per l'inferenza del tipo. static ed extern si comportano in modo simile, tuttavia C++ Aggiunge regole di archiviazione thread_local e class-member.

Sì. Gli assistenti basati sull'IA descrivono auto, register, static ed extern, suggeriscono lo specificatore corretto per ogni variabile e segnalano gli usi impropri, come ad esempio l'utilizzo dell'indirizzo di una variabile di registro.

Copilota GitHub Completa automaticamente i contatori statici, le dichiarazioni extern tra file e i suggerimenti sui registri, quindi spiega l'ambito e la durata in linea mentre digiti.

Riassumi questo post con: