Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка№7.docx
Скачиваний:
1
Добавлен:
25.11.2018
Размер:
35.37 Кб
Скачать

33. Передача адресов структур. Как необходимо оформить функцию,

чтобы в качестве аргумента функции использовать адрес

структуры, а не саму структуру.

34. C++ предоставляет вам возможность передавать структуры по

значению и позволяет передавать адрес структуры. Если glitz

является переменной типа структура, как вы передадите ее по

значению? Как вы передадите ее адрес? Каким может быть

компромисс между двумя подходами?

35. Рекурсия - назначение и принцип работы.

Функция в C++ обладает весьма интересным свойством — она

может вызывать саму себя. Это свойство называется рекурсией.

Когда рекурсивная функция вызывает саму себя, только что

вызванная функция также вызывает саму себя и т.д. до бесконечности,

если, конечно, ее программный код не содержит ничего такого, что

способно прервать эту последовательность вызовов. Обычно

рекурсивный вызов стараются сделать частью условного оператора.

рекурсивная функция типа void с именем recurs() может

иметь такой вид:

void recurs(список_аргументов)

{

операторы1

if (проверка)

recurs(аргументы)

операторы2

}

Рекурсивные вызовы порождают следующую цепь событий. Пока

условный оператор будет истинным, в результате каждого вызова

функции recurs() выполняется блок операторы 1, а затем выполняется

очередной вызов функции recurs(), при этом блок операторы 2 остается

вне досягаемости. Когда условный оператор примет значение false,

начинает выполняться блок операторов 2. Далее, когда выполнение

текущего блока будет завершено, управление программой передается к

предыдущей версии функции recurs, которая его вызвала. Затем эта

версия функции recurs() заканчивает выполнение своего блока

операторы 2 и завершается сама, возвращая управление предыдущему

вызову функции, и т.д.

Рекурсия особенно полезна в ситуациях, когда требуется

многократное разбиение задачи на две аналогичные подзадачи

меньшего масштаба

36. Указатели на функции. Адрес функции.

.Адресом функции является адрес, с которого начинается машинный код функции, хранящийся в памяти. Обычно пользователи не извлекают никаких преимуществ из того, что знают этот адрес, но эти сведения могут оказаться полезными для программы. Например, можно создать

функцию, которая принимает адрес другой функции в качестве

аргумента. Это дает возможность первой функции найти вторую

функцию и выполнить ее. Такой подход более громоздкий, чем прямое

обращение ко второй функции со стороны первой, тем не менее, он

позволяет осуществлять передачу адресов различных функций в

различные моменты. Это означает, что первая функция может

использовать различные функции в различные моменты.

37. Объявление указателя на функцию.

Аналогично указатель на функцию должен

указывать, на какой тип функции ссылается указатель. Это означает, что

такое объявление должно идентифицировать тип данных,

возвращаемых функцией, равно как и сигнатуру функции (список ее

аргументов). Другими словами, такое объявление должно сообщать нам

те же сведения о функции, которые уже содержатся в прототипе этой

функции.

38. Объявление указателя на функцию. Как отличить функцию

которая возвращает указатель от указателя на функцию?

В объявлении необходимо заключить *pf в круглые скобки, чтобы

соблюсти соответствующий приоритет операторов. Круглые скобки

имеют более высокий приоритет, чем оператор *, следовательно,

*pf(int) означает, что pf() — это функция, которая возвращает

указатель, в то время как (*pf)(int) означает, что pf является указателем

на функцию:

double (*pf)(int); // рf указывает на функцию,

// которая возвращает значение типа double

double *pf(int); // pf() является функцией,

// которая возвращает указатель на значение

// типа double