- •Базовые понятия информатики. Понятие «Информатика» и «Информация»
- •Информация
- •Информационные технологии
- •Понятие алгоритма. Свойства и классы алгоритмов. Формы представления алгоритмов
- •Понятие алгоритма. Базовые алгоритмические структуры
- •Представление данных в памяти персонального компьютера.
- •Принципы обработки программных кодов
- •Компиляторы
- •Интерпретатор
- •Язык с. История развития. Основные свойства языка
- •Отличительные особенности языкаC
- •Элементы языка c
- •Константы
- •Базовые типы данных
- •Директива #include
- •Использование void
- •Инструкция return
- •Описание переменных
- •Обработка данных. Операторы
- •Арифметические операторы
- •Приоритет операторов и порядок вычислений
- •Используемые алгоритмы обработки данных
- •Аккумуляторы
- •Преобразования типов данных
- •Декларации и дефиниции функций
- •Формальные и фактические параметры. Вызов функций
- •Возврат функцией значений
- •Переменные в функциях
- •Автоматические (локальные) переменные
- •Внешние (глобальные) переменные
- •Статические переменные
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Значения параметров по умолчанию
- •Перегрузка функций
- •Рекурсия
- •Встроенные функции
- •Обработка символьных данных
- •Функция puts()
- •Функция putchar()
- •Функция printf()
- •Выбор правильных средств вывода информации
- •Функция gets()
- •Функция getchar()
- •Функция scanf()
- •Выбор соответствующих средств ввода данных
- •Управляющие структуры Структуры выбора (if / else)
- •Структуры выбора (switch/case/default)
- •Структуры повторения (циклы)
- •Использование цикла for
- •Использование цикла do...While (постусловие)
- •Использование цикла while (предусловие)
- •Операторы передачи управления Оператор безусловного перехода goto
- •Оператор break
- •Оператор continue
- •Препроцессор языка Си
- •Массивы Объявление переменной массива
- •Использование индексной переменной
- •Инициализация массива при объявлении
- •Передача массивов в функции
- •Использование констант при объявлении массивов
- •Символьные строки
- •Массивы строк
- •Алгоритмы сортировки массива
- •Поиск заданного элемента в массиве
- •Указатели
- •Объявление указателя
- •Указатели на массивы
- •Операции над указателями
- •Указатели на строку
- •Указатели на функцию
- •Функции, возвращающие указатель
- •Указатели на многомерные массивы
- •Массивы указателей
- •Динамическое распределение памяти
- •Структуры данных
- •Реализация одних структур на базе других
- •Очередь
- •Операции над очередями
- •Операции над стеками
- •Ссылочные реализации структур данных
- •Операции над списками
Статические переменные
Автоматические (локальные) переменные существуют только во время выполнения функций, в которых они определены. В момент начала работы функции для такой переменной резервируется память. Когда выполнение функции заканчивается, зарезервированная область памяти освобождается и переменная прекращает свое существование.
Если функция вызывается неоднократно, локальные переменные создаются столько раз, сколько вызовов данной функции имеется в программе, поэтому адреса этих переменных могут все время меняться. Соответственно, и значения локальных переменных, хранящиеся в памяти, теряются каждый раз при завершении работы функции.
Тем не менее, значение, присвоенное переменной, можно сохранить в памяти и после окончания выполнения функции, если определить эту переменную как статическую. Это делается следующим образом:
myfunc()
{
staticintcount;
}
Адреса хранения статических переменных остаются неизменными на протяжении всего времени выполнения программы. После прекращения работы функции память, закрепленная за переменной, не освобождается, поэтому и записанное в ней значение переменной сохраняется. При следующем вызове этой же функции переменная будет иметь значение, оставшееся от предыдущего вызова. Запомните, что переменная при этом остается локальной и имеет смысл только внутри своей функции.
Передача параметров по значению
Когда параметр передается в функцию, по умолчанию используется техника, известная как передача параметра по значению, при которой функция обеспечивается копией значения параметра. При передаче параметра по значению любые изменения, выполняемые в функции над значением данного параметра, существуют только внутри самой функции. Когда функция завершается, значение переменной, переданной по значению, оказывается не измененным. Например, в следующей программе функции display_and_change передаются три параметра (переменные a, b и с):
#include <stdio.h>
void display_and_change(int first, int second, int third)
{
printf("Начальные значения функции %d%d%d\n",
first, second, third);
first += 100;
second +=100;
third+= 100;
printf("Конечные значения функции %d%d%d\n",
first, second, third);
}
void main(void)
{
int a=l, b=2, с = 3;
display_and_change(a, b, c);
printf("Конечные значенияmain%d%d%d\n",a,b,c);
}
После компиляции и выполнения программы на экран выводится:
C:\>NOCHANGE<ЕNTER>
Начальные значения функции 123
Конечные значения функции 101 102 103
Конечные значения main123
Как можно видеть, изменения, которые выполняются в функции для переменных, действенны только в самой функции. После завершения функции значения переменных в main остаются неизмененными.
При передаче параметров в функцию их значения размещаются в стеке. Для случая переменных a, b и с в стеке будут содержаться значения 1,2 и 3 соответственно. Любые изменения, выполняемые в функции над значениями параметров, в действительности изменяют значения ячеек стека.
При завершении выполнения функции стек освобождается, а следовательно, пропадают и изменения, сделанные функцией в ячейках стека. Ячейки памяти, содержащие значение каждой переменной, функцией не использовались. Таким образом, при передаче параметра по значению функция не может выполнить такую модификацию значений параметров, которая бы оставалась действующей и после завершения функции.