Barninga Z
a- a+

Le variabili C static

L'ACCESSIBILITÀ' E LA DURATA DELLEVARIABILI

Le variabili static 

Una variabile è static se dichiaratautilizzando, appunto, la parola chiave static

static float sF, *sFptr;

Nell'esempio sono dichiarate due variabilistatic: una di tipo float e un puntatore(static anch'esso) ad unfloat

Come nel caso delle variabili automatic, quellestatic sono locali al blocco di codice in cui sonodichiarate (e dunque sono accessibili solo all'interno diesso). La differenza consiste nel fatto che le variabilistatic hanno durata estesa a tutto il tempo diesecuzione del programma. Esse, pertanto, esistono giàprima che il blocco in cui sono dichiarate sia eseguito econtinuano ad esistere anche dopo il terminedell'esecuzione del medesimo. 

Ne segue che i valori in esse contenuti sono persistenti;quindi se il blocco di codice viene nuovamente eseguito essesi presentano con il valore posseduto al terminedell'esecuzione precedente. 

In altre parole, il compilatore alloca in modo permanentealle variabili static la memoria loronecessaria. 

Il tutto può essere chiarito con un paio diesempi: 

 

#includevoid incrementa(void){    int x = 0;    ++x;    printf("%d" ,x);}void main(void){    incrementa();    incrementa();    incrementa();}

Il programma chiama la funzione incrementa() 3volte; ad ogni chiamata la variabile x, automatic,è dichiarata ed inizializzata a 0. Essaè poi incrementata e visualizzata. L'output delprogramma è il seguente: 

1
1
1

 

Infatti x, essendo una variabile automatic,"sparisce" al termine dell'esecuzione dellafunzione in cui è dichiarata. Ad ogni chiamata essaè nuovamente allocata, inizializzata a 0,incrementata, visualizzata e... buttata alle ortiche.Indipendentemente dal numero di chiamate,incrementa() visualizza sempre il valore1

Riprendiamo ora la funzione incrementa(),modificando però la dichiarazione di x

void incrementa(void){    static int x = 0;    ++x;    printf("%d" ,x);}

Questa volta x è dichiarata static.Vediamo l'output del programma: 

1
2
3

 

La x è inizializzata a 0 solo unavolta, al momento della compilazione. Durante la primachiamata ad incrementa(), essa assume pertantovalore 1. Poiché x èstatic, il suo valore è persistente e nonviene perso in uscita dalla funzione. Ne deriva che allaseconda chiamata di incrementa() essa assume valore2 e, infine, 3 alla terzachiamata. 

Quando si specifica un valore iniziale per una variabileautomatic, detto valore è assegnato alla variabileogni volta che viene eseguito il blocco in cui la variabilestessa è dichiarata. Una inizializzazione come: 

{    int x = 1;    ....

non è che una forma abbreviata della seguente: 

{    int x;    x = 1;    ....

Quanto detto non è vero per le variabilistatic. Il valore iniziale di 1 nellaseguente riga di codice: 

static int x = 1;

viene assegnato alla variabile x una sola volta, infase di compilazione: il compilatore riserva spazio per lavariabile e vi memorizza il valore iniziale. Quando ilprogramma è eseguito, il valore iniziale dellavariabile è già presente in essa. 

Se il programmatore non inizializza esplicitamente unavariabile static, il compilatore le assegnaautomaticamente il valore NULL, cioè lozero. 

Va poi sottolineato che l'accessibilità di unavariabile static è comunque limitata (comeper le varibili automatic) al blocco di codice in cuiè dichiarata. Nel programma riportato per esempio, lavariabile x non è accessibile né inmain() né in qualunque altra funzioneeventualmente definita, ma solamente all'interno diincrementa()

Infine, è opportuno ricordare che un array dichiaratoin una funzione deve necessariamente essere dichiaratostatic se inizializzato contestualmente alladichiarazione. 

 



Ti potrebbe interessare anche

commenta la notizia

Ci sono 1 commenti
Anonimo
ma se volessi fare lo stesso con la possibilita' di scegliere se incrementare o decrementare come posso fare ????