Направления программирования. История создания языка Си. Особенности языка, страница 25

}

fprintf(ved, "Средний бал группы =%5.2f",sum/kol);

fclose(ved);return(0);

}

main()

{switch(create())

{case(-1): printf("Файл не открылся для записи");break;

case(0): printf("Файл создан");

}

}

п.14.Ккассы памяти.

Каждая переменная и функция, описанная в программе на Си, принадлежит какому-либо классу памяти. Класс памяти для переменной и функции определяет, какое время существования она имеет – глобальное или локальное и влияет на область действия переменной.

В Си все функции являются глобальными. Класс памяти задается либо по расположению ее описания, либо при помощи спецификатора класса памяти, который помещается перед описанием переменной.

Перечислим спецификаторы классов памяти:

auto – автоматическое или локальное время существования;

register – регистровое;

extern – внешнее;

static – статическое.

Класс памяти для функции всегда extern , если только перед описанием функции не стоит static.

1.  Автоматические переменные(auto).

Автоматические переменные можно описывать явно, используя спецификатор класса памяти auto, но такой способ описания применяется редко. Обычно указание на то, что переменная является автоматической, задается неявно и следует из положения в программе точки описания такой переменной. По умолчанию, всякая переменная, описанная внутри функции или блока, ограниченного в “{}”  и не имеющая явного указания на класс памяти, относится к классу автоматической переменной.

Поле видимости такой переменной от точки описания до конца блока, где она описана. Доступ к таким переменным из внешнего блока не возможен т.к. до момента входа в блок переменная еще не существует. Память для таких переменных отводится динамическая при входе в блок, а при выходе из блока память, отведенная под автоматические переменны, освобождается.

Применение автоматических переменных внутри локальных блоков позволяет приблизить переменную к месту ее использования, что повышает наглядность программы.

2.  Регистровые переменные.(register)

Спецификатор памяти register может использоваться только для автоматических переменных или для формальных параметров функции. Такой спецификатор указывает, что пользователь желает разместить переменную не в памяти, а в одном из регистров. Если в момент выполнения программы будет не хватать регистров, переменная будет размещена в памяти. Этот класс памяти рекомендуется использовать для переменных, доступ к которым в функциях выполняется часто. Полученный в результате код будет выполняться быстрее. В регистре может быть размещен объект, размером не более чем 2 байта (int).

К переменным, размещенным в регистре, нельзя применять операцию адресации.

register int x, y;

3.  Статические переменные и функции.(static).

Если функция описана со спецификатором класса памяти static, – это делает ее недоступной для других файлов. Переменная с таким классом памяти имеет глобальное время существования, но их область действия ограничивается блоком, в котором она описана. Память для такой переменной выделяется один раз и остается занятой до окончания выполнения программы. Инициализация таких переменных осуществляется один раз во время компиляции, поэтому статические переменные можно инициализировать только константными выражениями.

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

Пример:

void fanc1(void)

{ static int x=0;

printf(“x=%d”, x);

x++;

}

void fanc2(void)

{ int x=0;

printf(“x=%d”, x);

x++;

}

void main(void)

{ int i;

for(i=0;i<10;i++) 

fanc1(); Будет напечатано: 0, 1, 2, …

for(i=0;i<10;i++)    

fanc2(); Будет напечатано: 0, 0, 0,…

}

4.  Внешние переменные и функции.(extern)