Classi di archiviazione in C: diversi tipi di classi di archiviazione [con esempi]
Pubblicato: 2020-10-21La codifica con C è fortemente incentrata sull'utilizzo di variabili in ogni programma. Questi sono gli aspetti chiave della programmazione in C. Ogni variabile in C ha due proprietà; tipo e classi di archiviazione. Tra questi, il tipo fa riferimento al tipo di dati della variabile e le classi di archiviazione in C determinano l'ambito, la durata e la visibilità della variabile. Le classi di archiviazione in C vengono utilizzate per trovare la durata, la visibilità, la posizione di memoria e il valore iniziale di una variabile.
In questo post del blog, daremo uno sguardo dettagliato alle classi di archiviazione in C , ai suoi tipi e al modo in cui le sue caratteristiche influenzano l'output del programma con alcuni esempi di programmazione. Una classe di archiviazione in C viene utilizzata per rappresentare le informazioni di una variabile.
Impara a creare applicazioni come Swiggy, Quora, IMDB e altro
Sommario
Cosa sono le classi di archiviazione in C?
Le classi di archiviazione in C allocano l'area di archiviazione di una variabile che verrà conservata in memoria. Sono memorizzati nella RAM di un sistema. Oltre allo spazio di archiviazione, determinano l'ambito di una variabile. Le variabili nel programma C sono archiviate in una posizione fisica nella memoria casuale, che è principalmente la memoria del dispositivo e i registri della CPU.
Le classi di archiviazione in C definiscono anche la durata della variabile e la definiscono "locale" o "globale". Le classi di archiviazione sono utili anche per definire l'ambito o la visibilità e il valore iniziale della variabile. Ci sono principalmente quattro classi di archiviazione in C , vale a dire. automatico , di registro , statico ed esterno . Discuteremo ciascuno per uno ulteriormente.
Come vengono dichiarate le classi di memoria in C?
Le quattro classi di archiviazione in C sono dichiarate in un blocco o programma con gli identificatori di classe di archiviazione, auto, register, extern, static. C'è un altro identificatore di classe di archiviazione, 'typedef' utilizzato nella forma sintattica e non riserva spazio di archiviazione. Gli specificatori istruiscono il compilatore sulla memorizzazione delle variabili. La classe di archiviazione esterna in C dice al compilatore che la variabile definita è dichiarata con collegamento esterno.

C'è una differenza fondamentale tra la definizione e la dichiarazione di una variabile. Definire una variabile significa allocare la memoria per la variabile e dichiararla significa inizializzarla con un valore.
Sintassi:
storage_class_specifier tipo_dati nome_variabile;
Leggi: Idee e argomenti di progetto interessanti in C# per principianti
Caso speciale: quando nessun identificatore di classe di archiviazione è dichiarato o definito in un programma
Nella dichiarazione della variabile è presente almeno un identificatore di classe di archiviazione. Ma, nel caso in cui non sia specificato uno specificatore di classe di archiviazione, vengono seguite le seguenti regole:
1. Le variabili dichiarate all'interno di una funzione sono considerate auto.
2. Le funzioni dichiarate all'interno di una funzione sono considerate extern.
3. Le variabili e le funzioni dichiarate al di fuori di una funzione sono considerate statiche, con collegamento esterno .
Quali sono i tipi di classi di stoccaggio in C?
Ci sono quattro classi di archiviazione in C , diamo un'occhiata a loro:
1. Classi di Stoccaggio Automatico in C
Ogni variabile definita in una funzione o in un blocco appartiene per impostazione predefinita alla classe di archiviazione automatica se non è menzionata alcuna classe di archiviazione. Le variabili di una funzione o di un blocco che appartengono alla classe di memorizzazione automatica vengono dichiarate con lo specificatore auto. Le variabili sotto auto in C sono locali al blocco in cui sono definite e vengono scartate al di fuori del blocco.

Un semplice programma che mostra le classi di archiviazione automatiche:
#include <stdio.h>
int principale( )
{
auto int i = 11;
{
auto int i = 22;
{
auto int i = 33;
printf ("%d", i);
}
printf ("%d", i);
}
printf ( “%d”, i);
}
L'output del programma:
3 2 1
Spiegazione:
Nel programma precedente, la variabile i è dichiarata tre volte. Le variabili con lo stesso nome possono essere definite in blocchi diversi. Pertanto, questo programma verrà compilato ed eseguito correttamente senza alcun errore. La funzione 'printf' nel blocco più interno stamperà 3 e la variabile i in questo blocco verrà distrutta al termine del blocco.
Il successivo, il secondo blocco esterno stampa 2 a cui succede poi il blocco esterno che stampa 1. Le variabili automatiche sono inizializzate correttamente; altrimenti otterrai valori non definiti poiché il compilatore non fornisce loro un valore iniziale.
2. Registrare le Classi di Stoccaggio in C
Le variabili appartenenti ad una classe di memorizzazione dei registri sono equivalenti ad auto in C ma sono memorizzate nei registri della CPU e non nella memoria, da cui il nome. Sono quelli a cui si accede frequentemente. L'identificatore di registro viene utilizzato per dichiarare la variabile della classe di archiviazione del registro. Le variabili di una classe di archiviazione dei registri sono locali al blocco in cui vengono definite e distrutte al termine del blocco.
Un semplice programma che mostra le classi di archiviazione dei registri:
#include <stdio.h>
int principale()
{
registra int i = 10;
int *p = &i; //errore: indirizzo della variabile di registro richiesta
printf ("Valore di i: %d", *p);
printf ("Indirizzo di i: %u", p);
}
Spiegazione:
Nel programma sopra, il codice tenta di ottenere l'indirizzo della variabile i nella variabile puntatore p ma poiché i è dichiarato come variabile di registro, il codice non verrà compilato e visualizzerà l'errore "Errore: indirizzo della variabile di registro richiesta" .
Solo alcuni tipi di variabili vengono inseriti nei registri. Alle variabili di registro non viene assegnato un valore iniziale dal compilatore.
Impara: C++ vs Java: differenza tra C++ e Java
3. Classi di Stoccaggio Statico in C
La visibilità delle variabili statiche è zero al di fuori della loro funzione o file, ma i loro valori vengono mantenuti tra le chiamate. Le variabili con classe di archiviazione statica vengono dichiarate con l'identificatore statico. Le variabili statiche sono all'interno di una funzione o di un file. L'identificatore statico funziona in modo diverso con variabili locali e globali.
Programmi semplici che mostrano classi di archiviazione statiche con variabili locali e globali:
io. Variabile locale
#include <stdio.h>
void staticDemo()
{
int statico i;
{
int statico i = 1;
printf ("%d", i);
i++;
}
printf ("%d", i);
i++;
}
int principale()
{
staticDemo();
staticDemo();
}
L'output del programma:
1 0
2 1
Spiegazione:
Quando una variabile locale è definita da un identificatore statico, all'interno di una funzione o di un blocco, nel compilatore viene creato spazio di archiviazione permanente. La variabile locale statica è visibile alla funzione o al blocco in cui è specificata e mantiene il suo valore tra le chiamate di funzione. Nel programma precedente, la variabile statica i è definita in due punti in due blocchi all'interno della funzione staticDemo(). staticDemo() è chiamato due nella funzione principale. Nella chiamata successiva, le variabili statiche mantengono i loro vecchi valori e non devono essere inizializzate nuovamente.
ii. Variabile globale
#include <stdio.h>
int statico gInt = 1;
static void staticDemo()
{
int statico i;
printf ("%d", i);
i++;
printf ("%d", globalInt);
globaleInt++;
}
int principale()
{
staticDemo();
staticDemo();
}
L'output del programma:
0 1
1 2
Spiegazione:
Le variabili statiche devono essere inizializzate solo una volta in un programma e vengono mantenute per tutta la durata. Hanno un valore iniziale predefinito pari a zero.
Quando una variabile o una funzione globale è definita da un identificatore statico, tale variabile o funzione è nota solo al file in cui è definita. Per una variabile globale, altre routine di file non possono accedere e modificarne il contenuto poiché una variabile globale statica ha un collegamento interno. Nel programma precedente, la variabile globale statica globalInt e una funzione statica staticDemo() sono definite come statiche e non possono essere utilizzate al di fuori del file C.
4. Classi di Stoccaggio Esterno in C
Le variabili o le funzioni della classe di archiviazione esterna sono dichiarate dallo specificatore 'extern'. Quando una variabile viene dichiarata con l'identificatore extern, non viene allocata memoria alla variabile e si presume che sia stata già definita altrove nel programma. Con uno specificatore extern, la variabile non viene inizializzata. Il motivo per cui extern viene utilizzato per specificare una variabile in un programma per dichiararla con un collegamento esterno.
Un semplice programma che mostra le classi di archiviazione esterne:
#include <stdio.h>
interno i;
int principale()
{
printf ("i: %d", i);
}
int i = 1;
Spiegazione:

Nel programma C sopra, se extern int i viene rimosso, ci sarà un errore “Identificatore non dichiarato 'i' perché la variabile i è definita dopo essere stata utilizzata in printf. Lo specificatore extern indica al compilatore che la variabile i è stata definita ed è dichiarata qui.
Se modifichi extern int i; esternare int i = 5; riceverai un errore "Ridefinizione di 'i'" perché lo specificatore extern non inizializza una variabile.
Leggi anche: Le 7 migliori idee di progetti entusiasmanti in C per principianti
Parole finali
Questo articolo descrive in dettaglio il concetto di classi di archiviazione in C e spiega in che modo i suoi tipi differiscono l'uno dall'altro. Quando utilizzare una particolare classe di archiviazione dipende dall'assegnazione e dall'ambito, dalla durata e dalla visibilità della variabile con cui si ha a che fare.
Se sei interessato a saperne di più e hai bisogno del tutoraggio di esperti del settore, dai un'occhiata al diploma PG di upGrad & IIIT Banglore in sviluppo software full-stack .