Соответствующая часть стандарта C99, раздел 6.2.1 (Области применения идентификаторов):
4 [...] Если идентификатор обозначает два разных объекта в одном и том же пространстве имен, области действия могут перекрываться. Если это так, область действия одного объекта (внутренняя область) будет строгим подмножеством области действия другого объекта (внешняя область). Во внутренней области видимости обозначает сущность, объявленную во внутренней области; объект, объявленный во внешней области видимости, скрыт (и не виден) во внутренней области видимости.
Обновление
Для предотвращения исчезновения ответа pmg : Вы можете получить доступ к переменной внешнего блока, объявив указатель на нее до того, как произойдет скрытие:
int i = 5;
{
int *p = &i;
int i = 7;
printf("%d\n", *p); /* prints "5" */
}
Конечно, указывать скрытые переменные никогда не нужно и всегда плохой стиль.