- •Языки программирования. Классификация. Яп Си. Место Си в различных классификациях. Преимущества и недостатки.
- •2 Базовые конструкции яп. 3 вида констант *целочисленные, действительные, строковые). Правило составления идентификатора. Зарезервированные слова.
- •Константы
- •3 Общая структура программы на Си. Понятие функции. Функция main. Лексема.
- •Int main() // главная функция
- •5. Схема создания исполняемой программы
- •6. Понятие типа данных. Базовые типы данных языка Си и их характеристика.
- •7. Размещение программы в памяти. 4 цели использования памяти. 6 моделей памяти
- •8 Понятие переменной и 3 ее характеристики. Статические и динамические переменные. Операция присваивания.. Область действия переменной.
- •10 Внешняя память. Понятие глобальной и локальной переменной. Объявление с различными классами памяти.
- •11 Функции. Определение. Имя функции. Независимость. Возвращаемое значение. Прототип. Синтаксис прототипа функции. Оператор return.
- •Int func(int, double, int); // описание прототипа функции
- •12 Структурное программирование. Преимущества структурного программирования. Обработка вызова функции.
- •13 Различия между аргументами и параметрами функции. Передача в функцию адресов переменных.
- •14 Идентификатор, объявленный как функция. Правила определения области видимости функции. Формат вызова функции.
- •16 Понятие массива. Объявление массива. Случаи, в которых константное выражение может быть опущено. Сечение массива.
- •17 Пример объявления символьного массива. Вычисление адреса элемента массива. Связь между массивами и указателями.
- •19 Массивы указателей типа char(указатели и строки). Инициализация символьных массивов. Действия оператора «*».
- •20 Указатели на функцию. Объявление. Инициализация и использование указателя на функцию.
- •21 Передача указателя как аргумента в функцию. Встраиваемые функции. Ключевое слово inline.
- •22 Передача массивов в функцию (2 способа).
- •23 Функции с переменным числом параметров. Подключение stdarg.H. Средства работы и макросы
- •Va_start (ptr, последний_явный_параметр);
- •24 Массивы и динамическая память. Функции malloc, calloc, realloc, free- прототипы и краткий анализ.
- •25 Структуры. Понятие. Объявление. Определение. Обращение к полям структуры.
- •26 Сложные структуры. Структуры, содержащие массивы
- •28 Структуры и указатели. Указатели, как поля структур. Создание указателей на структуры. Указатели и массивы структур. Передача структур в функции.
- •29 Объединения. Определение. Создание. Инициализация. Обращение к отдельным объектам объединения. Создание структурных типов с помощью спецификатора typedef.
- •30 Создание динамически связанных структурных типов. Линейный список. Двусвязный список.
- •31 Потоки ввода-вывода. Понятие потока. Текстовые и двоичные потоки. Стандартные потоки.
- •32 Файлы. Имена файлов. Открытие файла. Ситуации, считающиеся ошибочными, в результате которых функция возвращает значение 0.
20 Указатели на функцию. Объявление. Инициализация и использование указателя на функцию.
Указатели на функцию
Указатели на функцию являются одним из дополнительных средств вызова функции. При выполнении программы под каждой её функцией располагается по определённому адресу. Указатель на функцию содержит начальный адрес функции, т.е. её точку входа.
Объявление указателя на функцию
Как и любая переменная, указатель на функцию должен быть объявлен, чтобы его можно было использовать.
Общая форма объявления указателя на функцию:
тип_ф-ции(*ptr_func) (список параметров);
// ↑ идентификатор
Этот оператор объявляет переменную ptr_func указателем на функцию, возвращающую значение заданного типа и принимающую указанный список параметров.
Примеры объявлений:
int (*f1)(int a);
double (*f2)(double x, double y);
void (*f3)(char* p);
int* f(int a);
Приоритет операции * ниже, чем приоритет скобок, поэтому приведённый
пример без скобок вокруг имени указателя является объявлением функции f,
возвращающей указатель типа int и не является указателем на функцию.
Инициализация и использование
Пример объявления и инициализации указателя на функцию:
int sqr(int i);
int (*ptr)(int i);
int sqr(int i)
{
return i*i;
}
int main()
{
ptr = sqr; // инициализация происходит, т.к.
// ptr и sqr имеют одинаковые
// список параметров и тип
// возвращаемого значения
int x;
x = ptr(7); // вызов функции sqr через ptr
return x;
}
21 Передача указателя как аргумента в функцию. Встраиваемые функции. Ключевое слово inline.
Передача указателя как аргумента в функцию
#include <stdio.h>
void one(void);
void two(void);
void other(void);
void func(void (*p)(void));
int main()
{
void (*ptr)(void);
int n;
for(;;) // бесконечный цикл
{
puts(“Введите целое число между 1 и 30, 0 – выход: ”);
scanf(“%d”, &n);
if(!n) break; // если 0, то выход
switch(n)
{
case 1: ptr = one; break;
case 2: ptr = two; break;
default: ptr = other;
}
func(ptr);
}
}
void one(void)
{
puts(“you entered 1”);
}
void two(void)
{
puts(“you entered 2”);
}
void other(void)
{
puts(“you entered some other than 1 or 2”);
}
void func(void (*p)(void))
{
p();
}
Встраиваемые функции (inline)
Встраиваемые функции обычно небольшие по размеру. Компилятор постарается выполнить самым быстрым возможным способом.
Термин «встраиваемая» возник от того, что вместо вызова функции выполняется её прямая вставка (встраивание) в тело вызывющей функции. Добавив к объявлению функции ключевое слово inline делам функцию встраиваемой. При этом компилятор постарается максимально оптимизировать её выполнение.
Следует знать, что вместо вызова функции скорее всего, но не обязательно, будет подставлен код в вызывающую функцию. Единственное, что гарантирует компилятор, это оптимизация выполнения функции. Вызов встраиваемой функции не отличается от вызова любых других функций.
Пример объявления: inline int f(int x) { …; }