Преди всичко е нужно да знаете, че в С както и в много други езици има променливи, които запазват стойности. Тези променливи представляват наименовано парче памет с определена големина. Големината на парчето памет зависи от типа на променливата, която сме обявили и понякога от архитектурата на компютъра.
Стойностите, които сме запазили в променливите се достъпват извиквайки името на променливата, която сме дефинирали.
int round = 42;
printf("Current round: %d\n", round);
Има няколко типа променливи
Локалните променливи присъстват или могат да бъдат използвани, извиквани, променяни в рамките на функцията или блок от код в който са дефинирани. Дефинирайки локална променлива във функция, след нейното изпълнение паметта се особождава и променливата не може да бъде достъпена или променена.
Да вземем пример с функция която трябва да преброим колко пъти е била извикана.
void call_me() {
int called = 0;
called++;
printf("called %d times\n");
}
В отзи случай след като извикаме call_me
всеки път ще получаваме случаен резултат, защото при всяко извикване на функцията променливната called
ще има стойност 1.
Глобалните променливи за разлика от локалните имат "по-дълъг живот". Те могат да бъдат използвани във всички функции. Промените по тях се запазват след извикването на функциите, които ги променят. С горният пример нещата се променят така:
int called = 0;
void call_me() {
called++;
printf("called %d times\n");
}
За да дефинираме променлива или функция като статична използваме ключовата дума static
. Тя може да бъде използвана по няколко причини.
Дефинирайки глобална статична променлива или функция, тя става видима само за текущият файл.
Използвайки примера за броенето на колко пъти е извикана дадена функция чрез статична променлива имаме следната ситуация:
#include <stdio.h>
void call_me() {
int local = 0;
static int counter = 0;
local++;
counter++;
printf("local = %d, counter = %d\n", local, counter);
}
int main() {
call_me();
call_me();
call_me();
}
Получаваме:
local = 1, counter = 1
local = 1, counter = 2
local = 1, counter = 3
Или в случай, че искаме да се подписугурим, че подаденият масив на функцията има поне 27 (в случая) елемента в себе си.
void initialize_gradebook(struct strudent_t students[static 27]) {
// ...
}