Попробую объяснить понятнее про область видимости.
Существует четыре области видимости: локальная, функция, файл и класс.
Локальная:
Есть блок, ограниченный фигурными скобками
{
...
int variable
...
}
Переменная существует с момента объявления и до закрывающей скобки блока.
Как только скобка закрылась, переменная исчезла. Вместо троеточия может быть любой код. В том числе содержащий еще блок {...}
Область видимости - функция
int func(void)
{
...
int variable;
...
}
В таком случае переменная существует от момента определения и до конца функции. Как только функция завершила свою работу, переменная перестала существовать.
Глобальная функция, область видимости - файл.
int Counter;
void loop()
{
Counter++;
}
Переменная существует все время выполнения программы.
Пример -
Код:
int Counter;
void Init(void)
{
Counter=5;
}
void loop(void)
{ // 1
Counter++;
int i;
for (i=0;i<5;i++)
{ //2
int j;
j=i*2;
if (j=10)
{ //3
int k;
k=j+5;
if (k>12)
{ //4
....
} //4
} //3
} //2
} //1
Переменная Counter объявлена глобальной. Соответственно, к ней можно обратиться в обеих функциях и переменная будет чество хранить значение.
Переменная i объявлена с областью видимости - функция. К ней нельзя обратиться в фенкции init. Более того, значение переменной i в момент входа в функцию не определено и может быть абсолютно любым! К этой переменной можно обратиться в любом месте функции loop - с момента ее объявления и до конца выполнения функции, пока не закроется скобка с номером 1.
Переменные j и k объявлены с локальной областью видимости. Переменная j существует пока процессор не выполнит закрывающую скобку 2. Переменная k - пока процессор не выполнит закрывающую скобку 3. Соответственно, при КАЖДОМ входе в цикл, переменная j имеет неизвестное значение.
А теперь разумный вопрос - а зачем это все!?
Ответа два:
1. не всегда хочется, чтобы в любом месте кода были видны все остальные переменные.
К примеру, пишешь мелкую функцию, внутри нее цикл от 1 до 10, она сделала свое дело и закончила работу. Она асболютно сепаратная - никого не волнует как у нее внутри называется переменная цикла. И если переменную цикла объявить внутри самой функции, то в результате переменная исчезнет по выходу из функции. Таким образом в каждой функции твоего модуля может быть определена переменная i и в каждой функции эта переменная будет своя!
2. Компилятор при смотри на область видимости и соответственно размещает переменные в памяти. Вышли из области видимости переменной - память, занимаемую переменной освободили. Нужно занять под новую переменную - пожалуйста, снова выделит.