Попробую объяснить понятнее про область видимости.

Существует четыре области видимости: локальная, функция, файл и класс.
Локальная:
Есть блок, ограниченный фигурными скобками
{
...
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. Компилятор при смотри на область видимости и соответственно размещает переменные в памяти. Вышли из области видимости переменной - память, занимаемую переменной освободили. Нужно занять под новую переменную - пожалуйста, снова выделит.