Слайд 2
![Функции](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-1.jpg)
Слайд 3
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-2.jpg)
Слайд 4
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-3.jpg)
Слайд 5
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-4.jpg)
Слайд 6
![Перегружаемая функция 1](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-5.jpg)
Слайд 7
![Перегружаемая функция 2](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-6.jpg)
Слайд 8
![Поменять 2 числа местами](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-7.jpg)
Слайд 9
![& взятие адреса](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-8.jpg)
Слайд 10
![Указатели позволяют обрабатывать многомерные и одномерные массивы, строки, символы, структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-9.jpg)
Указатели позволяют
обрабатывать многомерные и одномерные массивы, строки, символы, структуры и массивы
структур.
динамически создавать новые переменные в процессе выполнения программы.
обрабатывать связанные структуры: стеки, очереди, списки, деревья, сети.
передавать функциям адреса фактических параметров.
передавать функциям адреса функция в качестве параметров.
Слайд 11
![Определение Указатель-это переменная или константа, которая содержит значение адреса другой переменной.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-10.jpg)
Определение
Указатель-это переменная или константа, которая содержит значение адреса другой переменной.
Слайд 12
![Объявление указателей и основные операции над ними тип [модификатор] *](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-11.jpg)
Объявление указателей и основные операции над ними
тип [модификатор] *<имя-указателя>
тип-имя типа переменной,
адрес которой будет содержать переменная- указатель.(например integer, char, long)
имя-указателя –идентификатор переменной типа указатель.(имя собственное)
*- определяет переменную типа указатель.
Слайд 13
![Значение переменной-указателя-это адрес некоторой величины, целое без знака. Указатель содержит](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-12.jpg)
Значение переменной-указателя-это адрес некоторой величины, целое без знака.
Указатель содержит адрес
первого байта переменной определённого типа.
Тип адресуемой переменной, на которую ссылается указатель, определяет объём оперативной памяти, выделяемой переменной, связанной с указателем.
Слайд 14
![указатель содержит адрес нулевого байта этой переменной тип адресуемой переменной](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-13.jpg)
указатель содержит адрес нулевого байта этой переменной
тип адресуемой переменной определяет, сколько
байтов, начиная с нулевого (адреса, определённого указателем) занимает это значение
Слайд 15
![Примеры объявлений указателей](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-14.jpg)
Примеры объявлений указателей
Слайд 16
![& и * &-получение адреса переменной. *-извлечение значения, расположенного по этому адресу.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-15.jpg)
& и *
&-получение адреса переменной.
*-извлечение значения, расположенного по этому адресу.
Слайд 17
![&-имя переменной получение адреса, определяет адрес размещения значения переменной определённого](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-16.jpg)
&-имя переменной
получение адреса, определяет адрес размещения значения переменной определённого типа.
Операндом операции & должно быть имя переменной того же типа, для которой определён и указатель левой части оператора присваивания, получающий значение этого адреса.
Слайд 18
![*-имя указателя получение значения определённого типа по заданному адресу. Определяет](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-17.jpg)
*-имя указателя
получение значения определённого типа по заданному адресу. Определяет содержимое,
находящееся по адресу, который содержится в указателе-переменной или указателе-константе. Иначе: косвенная адресация.
Слайд 19
![Косвенная адресация помощью операции * осуществляет доступ к значению по](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-18.jpg)
Косвенная адресация
помощью операции * осуществляет доступ к значению по указателю, то есть
извлечение значения, расположенного по адресу-содержимому указателя. Операнд * (т.е имя после) должно быть типа указатель (ранее объявлено).
Слайд 20
![Инициализация указателя имя указателя_переменной=&имя_переменной int *ptri,i; //объявление указателя и переменной](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-19.jpg)
Инициализация указателя
имя указателя_переменной=&имя_переменной
int *ptri,i;
//объявление указателя и переменной типа int
ptri=&i;
//ptri получает значение адреса ‘i’
Слайд 21
![оператор присваивания, использующий имя указателя и * операцию косвенной адресации:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-20.jpg)
оператор присваивания, использующий имя указателя и * операцию косвенной адресации:
Имя_переменной=*имя_указателя
Имя указателя –это переменная
или константа, которая содержит адрес размещаемого значения, требуемого для переменной левой части оператора присваивания
i=*ptri;
// ‘i’ получает значение, расположенное по адресу
// содержащемся в указателе ‘ptri’
Слайд 22
![Взаимосвязь указателя, адреса и значения переменной](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-21.jpg)
Взаимосвязь указателя, адреса и значения переменной
Слайд 23
![Указатели можно использовать *ptri-значение переменной, находящейся по адресу, содержащемуся в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-22.jpg)
Указатели можно использовать
*ptri-значение переменной, находящейся по адресу, содержащемуся в указателе ptri
ptri-значение адреса
переменной
&ptri-адрес местоположения самого указателя
Слайд 24
![int i=123, j, *ptri; //объявление переменных и указателя ptri=&i; //инициализация](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-23.jpg)
int i=123, j, *ptri;
//объявление переменных и указателя
ptri=&i;
//инициализация указателя(присвоение адреса i)
j=*ptri+1;
//переменной i (*ptri) присваивается значение
//переменной i и к её содержимому прибавляется единичка.
Слайд 25
![Многоуровневая адресация int i=123; //где i-имя переменной int *pi=&i; //pi](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-24.jpg)
Многоуровневая адресация
int i=123;
//где i-имя переменной
int *pi=&i;
//pi –указатель на
переменную
int **ppi=π
//ppi-указатель на ‘указатель на переменную’
int ***pppi=&ppi;
//pppi-указатель на ‘указатель на ‘указатель на переменную’’.
Слайд 26
![Правила Полное количество звёздочек косвенной адресации, равное количеству звёздочек при](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-25.jpg)
Правила
Полное количество звёздочек косвенной адресации, равное количеству звёздочек при объявлении указателя,
определяет значение переменной.
Уменьшение количества звёздочек косвенной адресации добавляет к имени переменной слово ‘указатель’, причём этих слов может быть столько, сколько может быть уровней косвенной адресации для этих имён указателей, то есть столько, сколько звёздочек стоит в объявлении указателя.
Слайд 27
![Соответствие между количеством уточнений (*) и результатом обращения к значению с помощью указателя](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-26.jpg)
Соответствие между количеством уточнений (*) и результатом обращения к значению с
помощью указателя
Слайд 28
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-27.jpg)
Слайд 29
![Операции над указателями Присвоить указателю значение адреса данных, или нуль.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-28.jpg)
Операции над указателями
Присвоить указателю значение адреса данных, или нуль.
Увеличить (уменьшить)
значение указателя
Прибавить (вычесть) из значения указателя целое число
Сложить или вычесть значение одного указателя из другого
Сравнить два указателя с помощью операций отношения.
Слайд 30
![задать значение Переменной-указателю Присвоить указателю адрес переменной, имеющей место в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-29.jpg)
задать значение Переменной-указателю
Присвоить указателю адрес переменной, имеющей место в оперативной
памяти, или нуль:
ptri=&i;
ptri=NULL;
Объявить указатель вне функции (в том числе main) либо в любой функции, снабдив его описателем stastic, при этом начальным значением указателя является нулевой адрес (NULL)
Слайд 31
![Присвоить указателю значение другого указателя, который к этому времени уже](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-30.jpg)
Присвоить указателю значение другого указателя, который к этому времени уже инициализирован
(имеет определённое значение), например: ptri=ptrj; -это двойное указание одной и той же переменной.
Присвоить переменной-указателю значение с помощью функций malloc и calloc.
Слайд 32
![Изменение значений указателя +, ++, -, --](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-31.jpg)
Изменение значений указателя
+,
++,
-,
--
Слайд 33
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-32.jpg)
Слайд 34
![Связь с массивами int mas[10],*ptrm; ptrm=&mas[0]; *prtm==mas[0]==*(mas+0) ; //значение нулевого](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-33.jpg)
Связь с массивами
int mas[10],*ptrm;
ptrm=&mas[0];
*prtm==mas[0]==*(mas+0) ;
//значение нулевого элемента массива mas
*(ptrm+i)==mas[i]==*(mas+i);
//значение i-го элемента
массива mas
Слайд 35
![*mas+2==mas[0]+2; *(mas+i)-3==mas[i]-3;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-34.jpg)
*mas+2==mas[0]+2;
*(mas+i)-3==mas[i]-3;
Слайд 36
![*(&(mas[i+1])+2)++; ptrm==&mas[i+1]; //упрощение выражения, i не играет роли ptrm+2==&(mas[i+1])+2; //указатель](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-35.jpg)
*(&(mas[i+1])+2)++;
ptrm==&mas[i+1];
//упрощение выражения, i не играет роли
ptrm+2==&(mas[i+1])+2;
//указатель переводится на 2 элемента вперёд
*ptrm++==(*ptrm=*ptrm+1);
//содержимое ячейки
массива извлекается и к нему прибавляется единичка
Слайд 37
![префиксные (слева от имени указателя) постфиксные (справа от имени указателя)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-36.jpg)
префиксные (слева от имени указателя) постфиксные (справа от имени указателя)
Префиксные операции в
последовательности справа налево.
Использование значения, полученного после выполнения префиксных операций
Постфиксная операция над указателем.
Слайд 38
![*p++ сначала выполняется префиксная операция над указателем ,то есть определяется](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-37.jpg)
*p++ сначала выполняется префиксная операция над указателем ,то есть определяется значение *p-содержимое, расположенное
по адресу px, а затем выполняется постфиксная операция ++ увеличение значения указателя на квант памяти, то есть на 2 байта (если указатель типа int)
Слайд 39
![(++(*p)+2) сначала: *p -так как префиксные операции выполняются справа налево.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-38.jpg)
(++(*p)+2) сначала:
*p -так как префиксные операции выполняются справа налево.
*p=*p+1 -самая ‘левая’ префиксная операция
+2 -выполнение постфиксной
операции
Слайд 40
![Проблемы Попытка работать с неинициализированными указателям, то есть с указателем,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-39.jpg)
Проблемы
Попытка работать с неинициализированными указателям, то есть с указателем, не
содержащим адреса оперативной памяти (ОП), выделенной переменной.
Потеря ссылки, то есть значения указателя из-за присваивания ему нового значения до освобождения ОП, которою он адресует.
Не освобождение ОП, запрошенной с помощью функции malloc
Слайд 41
![Синтаксис указателей data_type *pointerName; data_type — тип данных, pointerName — имя указателя. int *integerPointer;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-40.jpg)
Синтаксис указателей
data_type *pointerName;
data_type — тип данных,
pointerName — имя указателя.
int *integerPointer;
Слайд 42
![// Объявление указателя и простой переменной в одной строке int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-41.jpg)
// Объявление указателя и простой переменной в одной строке
int *pointer1, // это
указатель
variable; // это обычная переменная типа int
// Объявление двух указателей в одно строке
int *pointer1, // это указатель с именем pointer1
*pointer2; // это указатель с именем pointer2
Слайд 43
![два способа использования указателя Использовать имя указателя без символа *,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-42.jpg)
два способа использования указателя
Использовать имя указателя без символа *, таким образом
можно получить фактический адрес ячейки памяти, куда ссылается указатель.
Использовать имя указателя с символом *, это позволит получить значение, хранящееся в памяти. В рамках указателей, у символа * есть техническое название — операция разыменования. По сути, мы принимаем ссылку на какой-то адрес памяти, чтобы получить фактическое значение.
Слайд 44
![Объявление указателя, получение адреса переменной Для того чтобы объявить указатель,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-43.jpg)
Объявление указателя, получение адреса переменной
Для того чтобы объявить указатель, который
будет ссылаться на переменную,
необходимо сначала получить адрес этой переменной.
Чтобы получить адрес памяти переменной (её расположение в памяти), нужно использовать знак & перед именем переменной.
Это позволяет узнать адрес ячейки памяти, в которой хранится значение переменной.
Эта операция называется — операция взятия адреса
Слайд 45
![int var = 5; // простое объявление переменной с предварительной](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-44.jpg)
int var = 5;
// простое объявление переменной с предварительной инициализацией
int *ptrVar;
//
объявили указатель, однако он пока ни на что не указывает
ptrVar = &var;
// теперь наш указатель ссылается на адрес в памяти, где хранится число 5
Слайд 46
![#include int main() { int var; // обычная целочисленная переменная](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-45.jpg)
#include
int main()
{
int var; // обычная целочисленная переменная
int *ptrVar; // целочисленный указатель (ptrVar
должен быть типа int, так как он будет ссылаться на переменную типа int)
ptrVar = &var; // присвоили указателю адрес ячейки в памяти, где лежит значение переменной var
scanf( "%d", &var ); // в переменную var положили значение, введенное с клавиатуры
printf( "%d\n", *ptrVar ); // вывод значения через указатель
getchar();
}
Слайд 47
![& & - унарный оператор, возвращающий адрес операнда в памяти](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-46.jpg)
&
& - унарный оператор, возвращающий адрес операнда в памяти
m = &count;
//помещает
в m адрес переменной count
q = *m;
//помещает значение count в q
Слайд 48
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-47.jpg)
Слайд 49
![Варианты обращения к элементам массива](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-48.jpg)
Варианты обращения к элементам массива
Слайд 50
![Обращение через указатели](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-49.jpg)
Обращение через указатели
Слайд 51
![Использование адресации](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-50.jpg)
Слайд 52
![Структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-51.jpg)
Слайд 53
![Общий вид для структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-52.jpg)
Слайд 54
![Ввод и вывод массива сложный](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-53.jpg)
Ввод и вывод массива сложный
Слайд 55
![Массив структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-54.jpg)
Слайд 56
![Ввод и вывод массива структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-55.jpg)
Ввод и вывод массива структур
Слайд 57
![Решение](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-56.jpg)
Слайд 58
![Массив из более сложных структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-57.jpg)
Массив из более сложных структур
Слайд 59
![Более сложный вариант вывода](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-58.jpg)
Более сложный вариант вывода
Слайд 60
![Поиск по простой структуре](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-59.jpg)
Поиск по простой структуре
Слайд 61
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-60.jpg)
Слайд 62
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-61.jpg)
Слайд 63
![Поиск по более сложной структуре](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-62.jpg)
Поиск по более сложной структуре
Слайд 64
![Поиск максимума. Перегрузка логических операторов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-63.jpg)
Поиск максимума. Перегрузка логических операторов
Слайд 65
![Поиск минимума](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-64.jpg)
Слайд 66
![Поиск максимума](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-65.jpg)
Слайд 67
![Для более сложной структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-66.jpg)
Для более сложной структуры
Слайд 68
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-67.jpg)
Слайд 69
![Возможная оптимизация - подбор ключа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-68.jpg)
Возможная оптимизация - подбор ключа
Слайд 70
![Предоставление массива в виде структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-69.jpg)
Предоставление массива в виде структуры
Слайд 71
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-70.jpg)
Слайд 72
![Поиск экстремумов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-71.jpg)
Слайд 73
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-72.jpg)
Слайд 74
![Передача по значению](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-73.jpg)
Слайд 75
![Передача по ссылке](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-74.jpg)
Слайд 76
![Вывод массива](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-75.jpg)
Слайд 77
![Массив неизвестного размера](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-76.jpg)
Массив неизвестного размера
Слайд 78
![Использование указателя](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-77.jpg)
Слайд 79
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-78.jpg)
Слайд 80
![Рекурсивный и нерекурсивый факториал](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-79.jpg)
Рекурсивный и нерекурсивый факториал
Слайд 81
![И вновь простая обработка массива с сортировкой](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-80.jpg)
И вновь простая обработка массива с сортировкой
Слайд 82
![switch case](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-81.jpg)
Слайд 83
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-82.jpg)
Слайд 84
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-83.jpg)
Слайд 85
![Локальная область видимости внутри case](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-84.jpg)
Локальная область видимости внутри case
Слайд 86
![Структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-85.jpg)
Слайд 87
![Структура для времени](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-86.jpg)
Слайд 88
![Функции внутри структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-87.jpg)
Слайд 89
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-88.jpg)
Слайд 90
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-89.jpg)
Слайд 91
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-90.jpg)
Слайд 92
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-91.jpg)
Слайд 93
![Сравнение двух времен в лоб](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-92.jpg)
Сравнение двух времен в лоб
Слайд 94
![Сравнение двух времен через перегрузку оператора](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-93.jpg)
Сравнение двух времен через перегрузку оператора
Слайд 95
![Перегрузка ввода и вывода](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-94.jpg)
Перегрузка ввода и вывода
Слайд 96
![Массив структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-95.jpg)
Слайд 97
![Ввод и вывод массива структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-96.jpg)
Ввод и вывод массива структур
Слайд 98
![Решение](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-97.jpg)
Слайд 99
![Массив из более сложных структур](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-98.jpg)
Массив из более сложных структур
Слайд 100
![Более сложный вариант вывода](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-99.jpg)
Более сложный вариант вывода
Слайд 101
![Поиск по простой структуре](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-100.jpg)
Поиск по простой структуре
Слайд 102
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-101.jpg)
Слайд 103
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-102.jpg)
Слайд 104
![Поиск по более сложной структуре](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-103.jpg)
Поиск по более сложной структуре
Слайд 105
![Поиск максимума. Перегрузка логических операторов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-104.jpg)
Поиск максимума. Перегрузка логических операторов
Слайд 106
![Поиск минимума](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-105.jpg)
Слайд 107
![Поиск максимума](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-106.jpg)
Слайд 108
![Для более сложной структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-107.jpg)
Для более сложной структуры
Слайд 109
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-108.jpg)
Слайд 110
![Возможная оптимизация - подбор ключа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-109.jpg)
Возможная оптимизация - подбор ключа
Слайд 111
![Предоставление массива в виде структуры](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-110.jpg)
Предоставление массива в виде структуры
Слайд 112
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-111.jpg)
Слайд 113
![Поиск экстремумов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-112.jpg)
Слайд 114
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-113.jpg)
Слайд 115
![Передача по значению](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-114.jpg)
Слайд 116
![Передача по ссылке](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-115.jpg)
Слайд 117
![Вывод массива](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-116.jpg)
Слайд 118
![Массив неизвестного размера](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-117.jpg)
Массив неизвестного размера
Слайд 119
![Использование указателя](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-118.jpg)
Слайд 120
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-119.jpg)
Слайд 121
![Рекурсивный и нерекурсивый факториал](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-120.jpg)
Рекурсивный и нерекурсивый факториал
Слайд 122
![Указатель на функцию void f() { } void (*pf)() =](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-121.jpg)
Указатель на функцию
void f() { }
void (*pf)() = &f;
pf();
f - функция.
переменная pf, является указателем
на функцию, которая ничего не возвращает и не принимает ни одного аргумента.
В определении pf ей присваивается адрес функции f.
В третьей строке вызывается функция по указатели pf(в данном случае будет вызвана функция f)
Слайд 123
![void f(int a) { } void g(int b) { }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-122.jpg)
void f(int a) { }
void g(int b) { }
void (*pf)(int) =
&f;
pf(10); // Вызывается f(10)
pf = &g;
pf(20); // Вызывается g(20)
Слайд 124
![void f() { } void g() { } void (*pf)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-123.jpg)
void f() { }
void g() { }
void (*pf) = &f; //
Верно, &f - указатель на функцию f
pf = g; // Тоже верно, имя функции(g) автоматически приводится к указателю на функцию.
Слайд 125
![Чтение произвольного числа символов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/313809/slide-124.jpg)
Чтение произвольного числа символов