- •1.Системы счисления.
- •2.Принцип программного управления.
- •3. Назначение и классификация языков программирования.
- •4.Понятие и состав систем программирования.
- •5. Понятие информации и алгоритмов.
- •6.Блок-схемы разветвляющихся алгоритмов.
- •7.Блок-схемы циклических алгоритмов.
- •8.Потоковый ввод/вывод данных.
- •9.Использование манипуляторов при вводе/выводе данных.
- •10.Управляющие коды-символы. Отображение специальных символов на экране монитора.
- •11.Форматированный ввод/вывод данных.
- •12.Строковый и символьный ввод-вывод информации.
- •14.Пространство имен. Ключевое слово using как директива.
- •15. Процессор и имена заголовочных файлов
- •16.Средства отладки программ ms vs
- •17.Выполнение приложения с использованием средств интерактивной отладки.
- •18.Выполнение приложения с использованием средств планируемой отладки.
- •20.Определение переменных. Переменные и константы.
- •Описание и инициализация переменных
- •Int k; // это переменная целого типа int
- •Задание и использование констант
- •21.Логические переменные и примеры их использования в программах.
- •22.Операции присваивания. Особенности выполнения. Условная операция ?:
- •Пример конструкции ветвления
- •25.Оператор перехода goto. Оператор return. Оператор return
- •Оператор goto
- •26.Особенности синтаксиса и выполнения операторов перехода continue, break.
- •Цикл for
- •Описание синтаксиса
- •30.Время существования и область видимости переменных (auto, static, extern, register).
- •31.Создание исполняемого файла.
- •32.Массив. Определение и инициализация массива.
- •Пример инициализации массива
- •33.Символы, строки (инициализация, алгоритмы). Символьный тип char
- •34.Стандартные функции работы со строками. Функции работы со строками c
- •35.Обработка символьной информации.
- •36.Инициализация многомерных массивов.
- •37.Матрицы. Инициализация, ввод, вывод, алгоритмы поиска в матрице.
- •38.Ввод, вывод двумерных массивов.
- •39.Операции над указателями. Типы указателей.
- •40. Указатели на указатели.
- •41.Указатели и строки.
- •42.Ссылочный тип данных.
- •43. Указатели на многомерные массивы.
- •44.Массивы и указатели. Понятие индекса. Инициализация. Доступ к компонентам.
- •45.Многомерные массивы. Связь между указателями и массивами. Связь между массивами и указателями
- •46.Объявление и определение функций.
- •47.Вызов и использование функций.
- •Возврат в вызывающую функцию
- •48.Способ передачи аргументов в функции. Массивы как параметры функций.
- •49.Перегрузка функций. Функции с переменным числом аргументов. Задание параметров функции по умолчанию.
- •50.Указатели как формальные параметры и как результат функций.
- •51.Ссылки как формальные параметры и как результат функций.
- •52.Использование указателей на функцию.
- •53.Передача указателя на функцию.
- •54.Использование макроопределений.
- •55.Динамические переменные. Основные свойства динамических переменных.
- •56.Динамические массивы.
- •57.Формирование динамических переменных с использованием библиотечных функций.
- •58.Формирование динамических переменных с использованием операций new и delete.
- •59.Массивы указателей как структура данных.
- •Типы данных, используемые при работе с массивами указателей
- •60.Многоуровневые указатели.
- •61.Динамические матрицы.
- •62.Передача параметров функции main. Передача параметров в функцию
- •Тип имя_функции (const тип_переменной* имя_переменной, …) Пример
52.Использование указателей на функцию.
Хотя функция - это не переменная, она все равно имеет физическое местоположение в памяти, которое может быть присвоено указателю. Адрес функции является входной точкой функции. Поэтому указатель на функцию может использоваться для вызова функции. В данном разделе мы рассмотрим более подробно указатели на функции.
В некоторых типах программ пользователь может выбирать некоторый вариант из списка возможных действий. Например, в системе подсчета может быть меню более чем с 20 вариантами. Когда выбор сделан, программа выполняет соответствующую функцию. Это может быть сделано двумя способами. Как правило, с этой целью используется оператор switch. Тем не менее в приложениях, где требуется высокая производительность, лучше применять другой способ. Можно использовать массив указателей, содержащих адреса функций. Выбор, сделанный пользователем, декодируется и используется для индексации массива указателей, вызывая выполнение необходимой функции. Этот метод гораздо быстрее, чем метод использования switch.
Для того, чтобы понять, как можно использовать массив указателей на функции вышеприведенным способом, представим, что необходимо создать простейшую систему инвентаризации, позволяющую вводить, удалять и просматривать данные, а также выходить в операционную систему. Если функции, выполняющие эти действия, называются соответственно enter(), del(), review() и quit(), то следующий фрагмент кода корректно инициализирует массив указателей на функции: void enter(void), del(void), review(void), quit(void); int menu(void); void (*options[])(void) = { enter, del, review, quit }; Необходимо обратить особое внимание на способ объявления массива указателей на функции, а также на использование круглых и квадратных скобок.
53.Передача указателя на функцию.
Возможность передачи указателей функциям может быть очень полезной, а также очень простой. Если необходимо сделать программу, которая добавляет пять к числу, то мы можем написать что-то похожее на следующий код:
#include <stdio.h> void AddFive(int Number) { Number = Number + 5; }
void main() { int nMyNumber = 18; printf("Оригинальное число равно %d\n", nMyNumber); AddFive(nMyNumber); printf("Оригинальное число равно %d\n", nMyNumber);}
Тем не менее, проблема заключается в том, что Number , к которому ссылаются в AddFive является копией переменной nMyNumber , переданной в функцию, а не самой переменной. Тем самым строка Number = Number + 5 добавляет пять к копии этой переменной, при этом оригинальная переменная в main() не будет изменена. Попробуйте запустить программу и убедитесь в этом сами. Чтобы обойти данную проблему, мы можем передать в функцию указатель того места, где данное число содержится, тем самым она будет ожидать указатель на число, а не число. Для этого мы изменим void AddFive(int Number) на void AddFive(int* Number), добавляя звездочку. Вот данная программа с внесенными изменениями. Заметьте, что мы должны убедиться, что передаем адрес nMyNumber вместо самого числа. Это выполняется посредством добавления символа & , который (как вы уже знаете) читается как "по адресу".
#include <stdio.h> void AddFive(int* Number) { *Number = *Number + 5;}
void main(){ int nMyNumber = 18; printf("Оригинальное число равно %d\n", nMyNumber); AddFive(&nMyNumber); printf("Оригинальное число равно %d\n", nMyNumber);}
Попробуйте придумать свой пример использования передачи указателей в функцию. Заметьте важность использования символа * до Number в функции AddFive. Это необходимо для указания компилятору, что мы хотим добавить пять к числу, на которое указывает переменная Number, а не добавлять пять к самому указателю. Наконец, последнее, что стоит упомянуть о функциях, так это то, что вы можете возвращать указатели из них примерно так:
int * MyFunction();
В данном примере MyFunction возвращает указатель на integer.