Указатели. Массив указателей на функции

Один из вопросов программирования, могущий возникнуть у изучающего С++, — это вопрос создания массива указателей на функции.
Иногда удобно использовать массивы функций. В самом примитивном случае можно вызывать функции в случайном порядке или задавать цепочки вызовов в нужном порядке. Непосредственно массив функций именно как массив — создать нельзя. Тем не менее, можно создавать указатели на функции и сохранять набор указателей в массиве указателей. Есть, правда, специальные обёртки, решающие подобное возникновение проблемы путём обхода использования указательных переменных, но эта статья изначально предполагалась как статья об указателях на функции. Иногда указатели на функции тоже может быть удобно использовать. Поэтому дальше будет описано как создавать массив указателей на функции, а не как использовать обёртки для решения подобных потребностей.
Пример кода:


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


Как и в случае запуска обычных функций, мы отдаём в функции аргументы, указывая их в круглых скобках, так и здесь. Хоть это и указательная переменная, которую мы используем как функцию, поскольку мы её используем как функцию, то должны подсказывать аргументы. К тому же имя функции умеет неявно приводиться к указательной переменной, поэтому нам необязательно разыменовывать указатель, когда мы задействуем ячейку, хранящую адрес функции, что немного облегчает понимание кода.
Ещё небольшой разбор кода с задействованием маленькой картинки. Код на картинке.
Смотрим на 13-ю строчку кода.

P является массивом из 3 указателей и при этом каждый из трёх указателей указывает на функцию с пустым списком формальных параметров (пустые скобки), и тип всей этой сущности — void обозначает тип каждой ячейки массива, т. е. тип функции, т. е. в ячейках массива можно хранить функции, тип у которых void.

Смотрим на 15-ю строчку кода. Там мы вытаскиваем значение из массива и использованием круглых скобок задействуем вытащенное значение как функцию. Не забываем, что индексация массивов начинается с нуля, и поэтому то, что мы пишем 2 в квадратных скобках в месте обращения к ячейке массива — будет обозначать третий индекс массива. (0,1,2) — двойка на третьей позиции. Так как в массиве расположены не самые обычные значения, а адреса функций, то и обращаемся мы к значениям не как к обычным значениям, а как к функциям, после чего и происходит вызов той функции, к которой мы обратились задействовав указатель, хранящийся в массиве.

Если вы легко разруливаете работу с параметрами функций, поймёте массив указателей, то эта тема может показаться вам очень даже лёгкой. Массив указателей на функции по сути ничем не отличается от обычного массива значений. Разве что обычные значения вызывать как функции не нужно, а массив — он и есть массив.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

2 комментария: Указатели. Массив указателей на функции

  • DanMan говорит:

    А каким образом аргумент передавать в функцию???




    0



    0
    • admin говорит:

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




      0



      0

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- У меня компьютер сам выключается... че делать? - У тебя системник внизу стоит? - Да. - Поменяй носки... он сознание теряет.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок