пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Классы памяти переменных в С и их особенности

Класс памяти определяет область действия переменной и продолжительность ее существования в оперативной памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Есть четыре ключевых слова, используемых для описания класса памяти:

  • auto – автоматический класс (временное существование, область действия – локальная);
  • extern – внешний класс (постоянное существование, область действия –глобальная);
  • static - статический класс (постоянное существование, область действия – локальная);
  • register – регистровый класс (временное существование, область действия – локальная, размещение – в регистрах центрального процессора, к которым доступ выполняется гораздо быстрее, чем в оперативной памяти).

1. как переменные, описанные внутри функции, по умолчанию  являются автоматическими. Можно, однако, это подчеркнуть явно с помощью ключевого слова auto:
main ( )
{
auto int x;

Автоматические переменные имеют локальную область действия. Только функция, в которой переменная определена, «знает ее». Другие функции могут использовать переменные с тем же самым именем, но это будут уже другие области памяти. Автоматическая переменная начинает существовать при вызове функции, содержащей ее. Когда функция завершает свою работу и возвращает управление туда, откуда ее вызвали, автоматическая переменная исчезает. Ячейка памяти может использоваться для чего–нибудь другого.

2. Переменная, описанная вне функции, является внешней. Внешнюю переменную можно описать в функции при помощи ключевого слова extern. Если в какой – либо функции используется какая – либо переменная, не объявленная в ней, то она считается внешней переменной с атрибутами, объявленными вне этой функции. Но, если переменная используется, но нигде вне функции не описана, то это – ошибка! Правда, такая ошибка будет выловлена при трансляции. Гораздо хуже будет, если в какой – либо функции мы забудем указать атрибут extern, хотя сама переменная будет описана в ней.

3. Статические переменные объявляется служебным словом static. Они имеют такую же область, что и автоматические переменные, но они не исчезают, когда содержащая их функция закончит свою работу. Программа хранит их значения от одного вызова функции к другому. Этот факт можно проверить на следующем примере:

#include <stdio.h>

#include <conio.h>

void F();

void main ()

{ int i;

  clrscr();

 for(i =1; i < 4; i++ )

 {

  printf("итерация %d : ”, i );

   F( ):

  }

 getch();
}

  void F()

   { int y = 1; //объявление и инициализация автоматической переменной

    static int x =1;// объявление и инициализация статической переменной

     printf (“x = %d   y = %d  \n”, x++ , y++ );

                           }

переменная  y не меняет своего значения, т. к. оператором int y = 1; для нее каждый раз выделяется новая ячейка и в нее посылается единица. В дальнейшем в операторе печати оператором  y++  значение y увеличивается на 1, но по окончании выполнения функции это значение исчезает вместе с ячейкой. Другое дело статическая переменная  x. Для нее ячейка выделяется в специальной статической области памяти и эта ячейка существует, пока выполняется программа. Кроме того, инициализация для нее выполняется только один раз при первом входе в функцию F. Эти особенности статической переменной и объясняют полученный нами результат работы программы.
Рассмотрим еще один вид статической переменной – внешней статической переменной, которая объявляется вне любой функции:

static x;// внешняя статическая переменная

float y()

{
  ….

}

Разница между внешней переменной и внешней статической переменной заключается в области их действия. Обычная внешняя переменная может использоваться функциями в любом файле, в то время как внешняя статическая переменная может использоваться только функциями того же самого файла.
 4.Регистровые переменные запоминаются в регистрах центрального процессора. Доступ к ним и работа с ними выполняется гораздо быстрее, чем в оперативной памяти. В остальном,  регистровые переменные аналогичны автоматическим переменным. Объявляются они служебным словом  register:

                                               register int x;
Следует иметь в виду, что описание переменной как регистровой является скорее просьбой, чем обязательно выполнимой командой. Компилятор сравнивает наше требование с количеством свободных регистров. Если есть возможность удовлетворить требование, то переменная размещается в регистре, в противном случае переменная становится простой автоматической переменной.


22.06.2017; 00:28
хиты: 68
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь