Статические переменные представляют собой третий класспамяти, в дополнении к автоматическим переменным и EXTERN, скоторыми мы уже встречались. Статические переменные могут быть либо внутренними, либовнешними. Внутренние статические переменные точно так же,как и автоматические, являются локальными для некоторой фун-кции, но, в отличие от автоматических, они остаются сущест-вовать, а не появляются и исчезают вместе с обращением кэтой функции. это означает, что внутренние статические пере-менные обеспечивают постоянное, недоступное извне хранениевнутри функции. Символьные строки, появляющиеся внутри функ-ции, как, например, аргументы PRINTF , являются внутреннимистатическими. Внешние статические переменные определены в остальнойчасти того исходного файла, в котором они описаны, но не вкаком-либо другом файле. Таким образом, они дают способскрывать имена, подобные BUF и BUFP в комбинацииGETCH-UNGETCH, которые в силу их совместного использованиядолжны быть внешними, но все же не доступными для пользова-телей GETCH и UNGETCH , чтобы исключалась возможность конф-ликта. Если эти две функции и две переменные объеденить водном файле следующим образом STATIC CHAR BUF[BUFSIZE]; /* BUFFER FOR UNGETCH */STATIC INT BUFP=0; /*NEXT FREE POSITION IN BUF */ GETCH() {...} UNGETCH() {...} то никакая другая функция не будет в состоянии обратиться кBUF и BUFP; фактически, они не будут вступать в конфликт стакими же именами из других файлов той же самой программы. Статическая память, как внутренняя, так и внешняя, спе-цифицируется словом STATIC , стоящим перед обычным описани-ем. Переменная является внешней, если она описана вне какойбы то ни было функции, и внутренней, если она описана внутринекоторой функции. Нормально функции являются внешними объектами; их именаизвестны глобально. возможно, однако, объявить функцию какSTATIC ; тогда ее имя становится неизвестным вне файла, вкотором оно описано. В языке "C" "STATIC" отражает не только постоянство, нои степень того, что можно назвать "приватностью". Внутренниестатические объекты определены только внутри одной функции;внешние статические объекты /переменные или функции/ опреде-лены только внутри того исходного файла, где они появляются,и их имена не вступают в конфликт с такими же именами пере-менных и функций из других файлов. Внешние статические переменные и функции предоставляютспособ организовывать данные и работающие с ними внутренниепроцедуры таким образом, что другие процедуры и данные немогут прийти с ними в конфликт даже по недоразумению. Напри-мер, функции GETCH и UNGETCH образуют "модуль" для ввода ивозвращения символов; BUF и BUFP должны быть статическими,чтобы они не были доступны извне. Точно так же функции PUSH,POP и CLEAR формируют модуль обработки стека; VAR и SP тожедолжны быть внешними статическими.