|
6.2. Глобальные
переменные. Классы памяти. До сих пор мы имели дело только с локальными переменными, которые известны и доступны только в той функции, в которой они объявлены. Однако существует возможность объявлять и глобальные переменные, о которых знают сразу несколько функций. В языке Паскаль для описания глобальных переменных не требуется никаких дополнительных средств. Глобальная переменная может быть описана в основной программе, и использоваться в процедурах и функциях без повторного объявления, как показано в приведённом фрагменте.
В данном примере, переменная x описана как глобальная величина и, после выполнения процедуры BETA, получит значение 1. Рассмотрим пример на языке Си.
В приведённом примере массив символов name является глобальной переменной, и доступен как в функции main, так и в nameinp. Чтобы сделать переменную глобальной (внешней), её описывают вне любого определения функции. Как известно, в Паскале описание глобальных переменных так же делается до того, как она будет использована процедурой или функцией. Вернёмся к программе на Си. Внутри функции, использующей глобальную переменную, её можно объявить как внешнюю при помощи ключевого слова extern, предшествующего спецификации типа переменной. Слово extern предлагает компилятору искать определение этой переменной вне функции. Таким образом, объявляется переменная лишь один раз, вне любого определения функции. Внутри функции на неё лишь ссылаются. Именно поэтому в приведённых функциях не указаны размеры массива литер. Таким образом, каждая переменная имеет тип и, кроме того, принадлежит к некоторому классу памяти. В языке Си есть четыре ключевых слова, которые используются для описания классов памяти: extern (для внешнего), auto (для автоматического), static и register. Определение класса памяти переменной зависит от того, где переменная описана и какое ключевое слово используется. Замечание! Заметим, что в языке Паскаль, при описании процедур и функций, можно использовать директивы. Директивы (задаются зарезервированным словом forward), как правило, применяются для обращения к внешним процедурам, не являющимся частью программы на языке Паскаль. Внешние процедура или функции, если они используются в программе на языке Паскаль, описываются следующим образом: задаётся заголовок процедуры или функции, а вместо тела записывается директива. В разных реализациях языка эта директива может быть разной, например extern, external, fortran и т.д. Синтаксис использования директив таков: директива=буква{буква|цифра} В Си класс памяти позволяет установить два факта:
По умолчанию переменные, описанные внутри функции, являются автоматическими. Однако, можно это явно подчеркнуть, используя ключевое слова auto. Автоматические переменные имеют локальную область действия. Только функция, в которой переменная описана, знает её. Другие функции могут использовать переменные с тем же именем, но это будут независимые переменные, находящиеся в разных ячейках памяти. Следует заметить, что в общем случае, область действия автоматической переменной ограничена блоком {} в котором она записана. Однако можно описать переменную внутри подблока. Тогда переменная будет известна только этой части функции. В Паскале же, любая переменная, объявленная в теле процедуры или функции, уже является локальной. Переменная в программе на Си, описанная вне функции, является внешней. Как уже было показано, внешнюю переменную можно также описать в функции, использующей её, при помощи ключевого слова extern. Группу extern-описаний можно совсем опустить, если исходные определения переменных появляются в том же файле и перед функцией, которая их использует. Ключевое слово extern позволяет функции использовать внешнюю переменную, даже если она определяется позже в этом или другом файле. Если слово extern не включить в описание внутри функции, то под этим именем создаётся новая автоматическая переменная. Отметим, что внешние переменные существуют, пока работает программа и, остаются доступными, даже если закончит работу какая-либо одна функция. Ключевое слово static, может использоваться для объявления переменных двух классов памяти: статических и внешних статических переменных. Статические переменные имеют такую же область действия, как автоматические, но они не исчезают, когда содержащая их функция закончит свою работу.
В приведённом примере статическая переменная count помнит своё преды-дущее значение, полу-ченное в результате работы функции, в то время как переменная num, создаётся каждый раз заново при вызове функции, и не может ничего помнить. Внешние статические переменные должны быть описаны вне любой функции. Разница между внешней переменной и внешней статической, заключается в области их действия. Если функции программы располагаются в нескольких файлах, то обычная внешняя переменная доступна в любом файле, в то время как статическая может использоваться только функциями того же самого файла, причём после определения переменной.
Ключевое слово register служит для выражения просьбы компьютеру разместить переменную не в памяти машины, а в регистрах центрального процессора, чтобы сделать доступ к ней наиболее быстрым. Во всём остальном регистровые переменные аналогичны автоматическим. Если у компьютера не хватает регистров для размещения регистровой переменной, то она становится обычной автоматической переменной. Кроме того, в язаке Си есть особый тип void, который используется для явного описания функций, не возвращающих значений. Например:
В языке Си разрешается преобразовывать выражения к типу void, для того, чтобы указать на игнорирование возвращаемого функцией значения. Например, если необходимо приостановить выполнение программы до момента нажатия какой-либо клавиши, необходимо ввести в неё строку: (void) getch( ); Здесь getch - библиотечная функция, читающая символ из входного буфера, который заполняется информацией с клавиатуры. Строка вида: (тип) выражение; преобразует выражение к типу, заданному в круглых скобках. Учитывается и приоритет операции преобразования типа. |