- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Inline функции
При каждом вызове функции в памяти создается её копия, то есть вызов функции расходует память. Если функция, имеющая небольшой размер, часто вызывается, то её можно объявить как inline (подставляемую). Объявленная таким образом функция не вызывается каждый раз, вместо этого текст функции подставляется в то место программы где она вызвана. При этом экономится память, но увеличивается размер кода. Объявление inline функции:
inline тип_возвращаемого_данного имя_функции(аргументы);
Класс памяти
В С(С+) каждая переменная и функция принадлежит некоторому классу памяти. Существуют следующие классы памяти переменных: автоматический (auto), статический (static), регистровый (register) и внешний (extern). Все переменные, объявленные в теле функции без указания класса памяти, имеют класс памяти auto, т.е. они являются локальными.
Автоматические переменные
Переменные этого класса являются локальными, то есть они доступны (существуют) в пределах блока, в котором они объявлены.
Память для нее автоматически выделяется каждый раз вначале блока и освобождается в конце. Доступ к такой переменной возможен только в блоке в котором она определена. Автоматические переменные инициализируют при их определении или присваивания.
Статические переменные
В программе могут находиться некоторые переменные, используемые только в функциях, входящих в состав программы. Указание static, примененное к внешней переменной или функции, ограничивает область действия соответствующего объекта концом файла.
static int i; // внешняя статическая переменная
main()
{ . . . // тело функции
}
Декларацию static можно использовать и для внутренних переменных. Аналогично автоматическим внутренние статические переменные локальны в функциях, но в отличие от автоматических они не возникают только на период выполнения функции, а существуют в памяти постоянно.
fun()
{ static int i; // статическая переменная
. . . // тело функции
}
Регистровые переменные
Спецификация register при объявлении переменных сообщает компилятору, что декларируемая переменная будет использоваться интенсивно. Такую переменную желательно размещать на одном из регистров машины. Это приведет к тому, что программа станет короче и работа ускорится. Пример декларации:
register int i,j;
register char k;
При этом компилятор имеет право проигнорировать указание разместить данные переменные в регистре машины. Спецификация register может применяться только к арифметическим переменным и к формальным параметрам функции. Объявление для формальных параметров имеет вид
fun(register unsigned int n, register char c)
{ register int k;
. . .
}
Ограниченное число регистров накладывает ограничение на число register–переменных: достаточно небольшое их число и при этом только определенных типов может быть размещено на регистрах. Избыточные register объявления игнорируются, а для переменной независимо от того выделен ей регистр или нет, не определено понятие адреса. Ограничение на количество и тип register–переменных зависят от типа процессора.