English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Le classi di memoria definiscono l'ambito (visibilità) e il ciclo di vita di una variabile o funzione nel programma C. Questi segnalatori vengono posizionati prima del tipo che修饰izzano. Di seguito è riportato un elenco delle classi di memoria disponibili nel programma C:
auto
register
static
extern
auto La classe di memoria è la classe di memoria predefinita per tutte le variabili locali.
{ int mount; auto int month; }
L'esempio precedente definisce due variabili con la stessa classe di memoria, 'auto' può essere usato solo all'interno di funzioni, quindi 'auto' può solo modificare variabili locali.
register La classe di memoria viene utilizzata per definire variabili locali che vengono memorizzate nel registro invece della RAM. Questo significa che la dimensione massima della variabile è uguale alla dimensione del registro (solitamente una parola) e non può essere applicato l'operatore unario '&' (poiché non ha un indirizzo di memoria).
{ register int miles; }
Il registro è utilizzato solo per variabili che necessitano di accesso veloce, come i contatori. È anche importante notare che definire 'register' non significa che la variabile verrà memorizzata nel registro, ma significa che potrebbe essere memorizzata nel registro, a seconda dei limiti hardware e dell'implementazione.
static La classe di memoria indica al compilatore di mantenere la presenza di variabili locali nel ciclo di vita del programma, senza doverle creare e distruggere ogni volta che entrano e uscono dal loro ambito. Pertanto, l'uso di 'static' per variabili locali può mantenere il valore della variabile tra chiamate di funzione.
Il modificador 'static' può anche essere applicato a variabili globali. Quando 'static' viene applicato a una variabile globale, limita l'ambito della variabile al file in cui è stata dichiarata.
Una variabile o metodo statico dichiarata globalmente può essere chiamato da qualsiasi funzione o metodo, purché questi ultimi appaiano nello stesso file in cui è dichiarato il variabile o metodo statico.
Esempi seguenti illustrano l'applicazione di 'static' per variabili globali e locali:
#include <stdio.h> /* dichiarazione della funzione */ void func1(void); static int count = 12; /* variabile globale - 'static' è il valore predefinito */ int main() { while (count--) { func1(); } return 0; } void func1(void); { /* 'hello' è una variabile locale di 'func1' - inizializzata una sola volta */ * Ogni chiamata alla funzione 'func1' non resetta il valore 'hello'. */ static int hello = 4; hello++; printf(" %d hello, %d count\n", hello, count); }
Nel esempio, count come variabile globale può essere utilizzata all'interno della funzione, hello utilizzando l'attributo static non viene reimpostato ad ogni chiamata.
Forse non capisci ancora questo esempio, perché ho usato funzioni e variabili globali, concetti che fino ad ora non sono stati spiegati. Non c'è problema se non capisci tutto ora; nei capitoli successivi spiegheremo nel dettaglio. Quando il codice sopra viene compilato ed eseguito, produce i seguenti risultati:
hello è 5, count è 11 hello è 6, count è 10 hello è 7, count è 9 hello è 8, count è 8 hello è 9, count è 7 hello è 10, count è 6 hello è 11, count è 5 hello è 12, count è 4 hello è 13, count è 3 hello è 14, count è 2 hello è 15, count è 1 hello è 16, count è 0
extern La classe di memoria viene utilizzata per fornire un riferimento a una variabile globale, che è visibile a tutti i file del programma. Quando utilizzi extern Per variabili che non possono essere inizializzate, viene assegnato il nome della variabile a una posizione di memorizzazione precedentemente definita.
Quando hai più file e hai definito una variabile o funzione che può essere utilizzata in altri file, puoi usarla extern Per ottenere il riferimento a una variabile o funzione già definita. Puoi intendere così:extern Serve per dichiarare una variabile globale o una funzione in un altro file.
L'attributo extern viene utilizzato solitamente quando ci sono due o più file che condividono la stessa variabile globale o funzione, come nel seguente esempio:
Primo file: main.c
#include <stdio.h> int count; extern void write_extern(); int main() { count = 5; write_extern(); }
Secondo file: support.c
#include <stdio.h> extern int count; void write_extern(void) { printf("count è %d\n", count); }
Ecco, nel secondo file extern La parola chiave è utilizzata per dichiarare che è stata definita nel primo file main.c count。Ora, compila questi due file, come segue:
$ gcc main.c support.c
Questo produrrà a.out Il programma eseguibile, quando viene eseguito, produce i seguenti risultati:
count è 5