Migliore risposta
Non confondere un tipo (come int
) con altri aspetti delle dichiarazioni (ad esempio, una classe di archiviazione come static
).
Vale a dire, in:
int x;
static int y;
x
e y
hanno lo stesso tipo, int
(il termine “ tipo di dati ” è meno comunemente usato in C e C ++; tuttavia non è sbagliato).
La parola chiave static
ha tre diversi significati in C. Nellesempio sopra, indica quella variabile y
è “privata” per quella particolare unità di traduzione (poiché lunità di traduzione può essere considerata come un file di origine dopo tutte le #include
direttive sono stati elaborati). Quindi una variabile y
dichiarata in unaltra unità di traduzione è distinta da questa.
Ecco un esempio del secondo significato di static
in C:
void f() {
static int n = 2;
...
}
Questo statico significa che la variabile n
è condiviso tra tutti i richiami di f()
e rimane in essere anche dopo che f()
ritorna (potresti, ad esempio, restituire un puntatore ad esso). Linizializzazione di n
in 2
solo avviene prima dellavvio del programma in C (alla prima invocazione di f()
in C ++). Quindi la seconda (e successiva) volta f()
viene invocata, n
manterrà il valore che aveva prima (finché il programma non lo modifica di nuovo esplicitamente ).
Il terzo significato è meno comune (e, credo, meno noto):
void g(double x[static 5]) {
...
}
Ciò indica che g()
può essere chiamato solo con un puntatore al primo di almeno 5 double
valori nella formazione di array.
EDIT: corretta spiegazione di local inizializzazione statica come (vedere il commento di Jesse Pollard).
Risposta
Statico è lopposto di dinamico. Eh? Significa che la memoria allocata per quella variabile non si sposta in memoria. Significa anche che in ripetute chiamate a funzioni che accedono a quella variabile, non vengono create nuove copie shadow della variabile; viene utilizzata la variabile originale e qualsiasi altra funzione che accede a quella variabile a quellindirizzo può modificarla o leggerla. Non è di per sé una variabile globale; lambito rimane lo stesso di dove e come è stato definito. Potrebbe essere, però. Tuttavia, sarebbe un errore provare a definire unaltra variabile statica con lo stesso nome nello stesso file o inclusa in unapplicazione.
considera una semplice funzione C add:
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
count e last sono definiti statici. Ciò significa che i valori inseriti in essi persistono per più chiamate da aggiungere. count e last vengono inizializzati a zero, ma non azzerati a ogni chiamata. Si noti che lambito di count e last sono solo allinterno della funzione add. Potrebbero non essere condivisi con altre funzioni o essere accessibili al di fuori di add, quindi per ottenerli devi stamparli dallinterno della funzione. Altre funzioni potrebbero avere un conteggio identico e anche le ultime variabili statiche e non interagirebbero mai.
Ora guarda questo programma di test:
#include
static int count = 5;
static int last = 0;
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
int main(int argc, char**argv )
{
static int count = 10;
static int last = 0;
int i;
int a=1, b=1;
for(i = 0 ; i < count ; i++)
{
a = add(a, b);
b = add(a, last);
last = add(a, b);
}
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last);
return 0;
}
Tre sono 3 set di variabili statiche count e last; sono tutti separati. I primi sono i globali, non vengono mai usati qui. main
ha il proprio set che utilizza perché le sue variabili locali ombreggiano le globali. add
ha il proprio set che ombreggia sia le principali che le globali con lo stesso nome.
Definizioni di funzioni statiche sono un tipo diverso di cose. La parola statica indica che la funzione è visibile solo nel file compilato dallorigine in cui è definita la funzione. Questo è il file di origine (".c") o unintestazione (".h) file incluso in esso. Ciò può essere necessario se i file oggetto che stai utilizzando hanno più di una versione di una funzione con lo stesso nome, (come add, print, error, ...) in modo che la combinazione di file oggetto (". O") insieme come moduli non causano conflitti di denominazione.