Variabili locali
Le variabili dichiarate in un blocco delimitato da parentesi graffe hanno visibilità solo all'intero del blocco stesso o in blocchi più interni. Tali variabili sono dette locali.
Un blocco più interno può contenere nuovamente la dichiarazione di una variabile già dichiarata in un blocco più esterno senza che questo crei errori o ambiguità: la variabile più interna è una differente variabile e le operazioni fatte su questa non modificano il valore della variabile più esterna.
Un tipico uso di variabili locali è all'interno delle funzioni, infatti le variabili dichiarate nel corpo di una funzione sono locali ed hanno visibilità solo all'interno della funzione stessa.
Esempio:
#include <stdio.h>
void foo()
{
int k; // variabile locale a foo
k=9;
printf("foo: k=%d\n", k); //stampa "foo: k=9"
return;
}
int main()
{
int k; // variabile locale al main
k=5;
foo();
printf("main: k=%d\n", k); //stampa "main: k=5"
{
int k; // variabile locale al blocco
k=6;
printf("blocco: k=%d\n", k); //stampa "blocco; k=6"
}
printf("main: k=%d\n", k); //stampa "main: k=5"
return 0;
}
Variabili globali
Le variabili dichiarate al di fuori del main e delle funzioni sono dette globali ed hanno visibilità sia nel main che nelle funzioni presenti nel file in cui avviene la dichiarazione.
Nel caso in cui il programma sia distribuito su più file (ad esempio, potrebbe essere utilizzato un differente file per ciascuna funzione), occorre richiamare la direttiva extern per consentire la visibilità di una variabile globale in un file diverso da quello in cui la variabile è dichiarata.
Invece, per limitare la visibilità di una variabile globale al solo file in cui è dichiarata, occorre utilizzare la direttiva static.
Esempio:
#include <stdio.h>
int k; // variabile globale
void foo()
{
k=9;
printf("foo: k=%d\n", k); //stampa "foo; k=9"
return;
}
int main()
{
k=5;
foo();
printf("main: k=%d\n", k); //stampa "main; k=9"
return 0;
}
Variabili automatiche
Le variabili automatiche hanno la caratteristica di essere allocate solo per il tempo strettamente necessario ad eseguire le istruzioni contenute nel blocco in cui la variabile è dichiarata.
Ad esempio, le variabili automatiche di una funzione sono allocate quando è richiamata la funzione in questione e sono deallocate quando la funzione termina.
Se una funzione è richiamata più volte, le sue variabili automatiche "nascono" e "muoiono" ad ogni invocazione e non "ricordano" il valore assunto durante la precedente invocazione.
Le variabile dichiarate all'interno di un blocco, sia esso il main o una generica funzione, sono sempre automatiche, eccetto il caso in cui si utilizza la direttiva static.
E' possibile, ma del tutto insolito, utilizzare la direttiva auto per esplicitare che una variabile è automatica (l'omissione di tale direttiva non compotrta nessuna differenza).
Le variabili automatiche quando sono allocate assumono un valore non prevedibile a priori.
#include <stdio.h>
void foo()
{
auto int k; // k è una variabile automatica
int m; // m è una variabile automatica
k=9;
m=5;
printf("foo: k=%d m=%d\n", k, m);
return;
}
int main()
{
foo();
return 0;
}
Variabili statiche
Le variabili statiche hanno la caratteristica di essere allocate alla partenza del programma e di essere deallocate solo quando il programma termina.
Sono statiche le variabili globali e le variabili locali che utilizzano la direttiva static.
Le variabile statiche quando sono allocate assumono un valore predefinito (0 nel caso di variabili numeriche).
Diversamente da come accade alle variabili automatiche, le variabili locali di tipo statico dichiarate all'interno di un blocco (ad esempio una funzione) "ricordano" il valore assunto alla precedente esecuzione del blocco stesso.
#include <stdio.h>
int k; // variabile statica
static int m; // variabile statica
void foo()
{
static int n; // variabile statica
n++;
printf("foo: invocazione n. %d\n", n);
printf("variabili globali: k=%d m=%d\n\n", k, m);
k++;
m++;
return;
}
int main()
{
k=7;
m=8;
foo();
foo();
foo();
return 0;
}
Sito: 7ecnologie
Sezione: 08. C language
Capitolo: 02. Introduzione al C
Paragrafo: 16. Variabili: visibilità e durata
Indice dei capitoli: 00. Risorse - 01 Ambiente di sviluppo - 02. Introduzione al C - 03. Le librerie - 04. Tutorial - 05. Esercizi svolti - 98. Esercizi
Indice dei paragrafi: 01. Hello World - 02. Variabile di tipo int - 03. Input da tastiera - 04. Controllo condizionale if - 05. Operatori logici - 06. Ciclo while - 07. Operatore modulo - 08. Array - 09. Ciclo for - 10. Ciclo do/while - 11. Variabili di tipo float - 12. Funzione random() - 13. Impostazione del set di caratteri - 14. Definizione di funzioni - 15. Passaggio di parametri: gli array - 16. Variabili: visibilità e durata - 17. Il tipo char - 18. I file - 19. Funzioni matematiche