Le variabili dovrebbero essere visibili dal minor numero di moduli e funzioni, per evitare che del codice poco robusto possa andare a modificarne il contenuto generando dei bug di difficile individuazione e, più in generale, per garantire una pulizia del codice maggiore.

Esempio chiarificatore sull'uso corretto di una variabile e di un passaggio per indirizzo (o riferimento):

codice:
void cambia_valore (int *var)
{
  var++;
}

int main (int argc, char **argv)
{
    int pippo;
    pippo = 2;

    cambia_valore (&pippo);

    printf ("%d\n", pippo);
}
Secondo te questo codice cosa stamperà? 2 o 3?

Se avessi dichiarato la variabile all'inizio del file (appena sotto gli include per capirci) sarebbe stata globale a livello di modulo e il programma avrebbe funzionato ugualmente, ma avrei allocato dello spazio nello heap e sarei soggetto a effetti collaterali come quelli descritti sopra. Studia, studia e ancora studia, e fai pratica, solo così potrai sciogliere i dubbi.