Autor: Dondu
Kurs języka C: Spis treści
Zmienna lokalna statyczna, to zmienna dostępna w danej funkcji lub bloku i jej wartość jest pamiętana w po opuszczeniu funkcji, czy bloku.
Wartość "zwykłej" zmiennej lokalnej jest tracona w momencie opuszczenia funkcji lub bloku, natomiast wartość zmiennych statycznych nie jest tracona, przez co możliwa do wykorzystania przy następnym wejściu do funkcji lub bloku.
{ //początek bloku //... jakiś kod static char nazwa_zmiennej; //zmienna lokalna statyczna typu char //... jakiś kod } //koniec bloku
Zobaczmy przykład dla funkcji:
Przykład 1 (w kompilatorze)
void pokaz(void) { //zmienna lokalna statyczna, której wartość jest pamiętana w funkcji static char ilosc_koni = 1; //zmienna lokalna "zwykła" char ilosc_kotow = 1; //wyświetl zmienne printf("- ilosc_koni = %d \n", ilosc_koni); printf("- ilosc_kotow = %d \n\n", ilosc_kotow); //powiększ zmienne ilosc_koni = ilosc_koni + 1; ilosc_kotow= ilosc_kotow + 1; } int main(void) { printf("Pierwsze wywolanie funkcji:\n"); pokaz(); //wywołaj funkcję pokaz() printf("Drugie wywolanie funkcji:\n"); pokaz(); //wywołaj funkcję pokaz() printf("Trzecie wywolanie funkcji:\n"); pokaz(); //wywołaj funkcję pokaz() return 0; }
Teraz sprawdzimy, czy w zakresie bloku jest tak samo. Jako blok wykorzystamy pętlę do{ } while( ):
Przykład 2 (w kompilatorze)
int main(void) { //zmienna pomocnicza - licznik pętli char licznik = 1; do { printf("Petla nr: %d\n", licznik); //zmienna lokalna statyczna, której wartość jest pamiętana w funkcji static char ilosc_koni = 55; //zmienna lokalna "zwykła" char ilosc_kotow = 40; //wyświetl zmienne printf("- ilosc_koni = %d \n", ilosc_koni); printf("- ilosc_kotow = %d \n\n", ilosc_kotow); //powiększ zmienne ilosc_koni = ilosc_koni + 1; ilosc_kotow= ilosc_kotow + 1; } while(++licznik <= 5); return 0; }
Jak widzisz wartość zmiennej static jest pamiętana w zakresie bloku, niezależnie, czy blokiem tym jest funkcja, pętla, czy sam blok.
Kurs języka C: Spis treści
7
Ot taka tam dywagacja... Zawsze mnie zastanawiało, dlaczego przy powtórnym użyciu zmienna statyczna nie jest nadpisywana wartością, którą jej przypisujemy podczas deklaracji. Rzutując to na przykład numer 2, każdorazowe wywołanie linii "static char ilosc_koni = 55;" może błędnie sugerować początkującemu programiście, że wartość 55 zostanie przypisana zmiennej "ilosc_koni" przy każdym przejściu przez pętlę "do". Trzeba przyznać, że twórcy języka C stworzyli tutaj coś mało intuicyjnego. Choć z drugiej strony, ten kto świadomie zaczyna używać zmiennych statycznych, raczej wie co jest grane ;)
OdpowiedzUsuńAby odpowiedzieć na to pytanie trzeba się zagłębić nieco w sposób w jaki program jest kompilowany i linkowany oraz w kod rozruchowy C. Ogólnie, zmienne statyczne trafiają do specjalnej sekcji pamięci, która jest inicjalizowana wartościami początkowymi tylko raz, przez kod startowy programu C. Stąd też zmienna ilosc_koni ma nadawaną wartość początkową nie w chwili wejścia do funkcji, w której jest zdefiniowana, lecz w chwili startu programu C. Zmienne statyczne można więc traktować jak zmienne globalne, z tym, że ograniczona jest widoczność zmiennej do bloku w którym została zdefiniowana.
Usuń