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.

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
Passaggio 2) Selezionare C e fare clic su Avanti
Passaggio 3) Fare clic su Avanti
Passaggio 4) Inserisci i dettagli e fai clic su Avanti
Passaggio 5) Fare clic su Fine
Passaggio 6) Inserisci il codice principale come mostrato nel programma precedente nel file main.c e salvalo.
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.
Passaggio 8) Inserire e salvare il codice C del file original.c mostrato nell'esempio precedente, senza la funzione main().
Passaggio 9) Compila ed esegui il tuo progetto. Il risultato è mostrato nella figura successiva.
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 |








