Другая точка зрения, помимо других хороших ответов здесь:
В C есть только указатели на функции, нет никаких функций.
Я имею в виду, вы пишете функции, но вы не можете манипулировать функциями. Во время выполнения нет представления функции как таковой. Вы даже не можете назвать «функцию». Когда вы пишете:
my_function(my_arg);
То, что вы на самом деле говорите, это «выполнить вызов указателя my_function
с указанным аргументом». Вы делаете вызов через указатель на функцию. Этот спад до указателя на функцию означает, что следующие команды эквивалентны предыдущему вызову функции:
(&my_function)(my_arg);
(*my_function)(my_arg);
(**my_function)(my_arg);
(&**my_function)(my_arg);
(***my_function)(my_arg);
и т. Д. (Спасибо @LuuVinhPhuc).
Итак, вы уже используете указатели функций в качестве значений . Очевидно, что вы хотели бы иметь переменные для этих значений - и вот где используются все другие элементы: полиморфизм / настройка (как в qsort), обратные вызовы, таблицы переходов и т. Д.
В C ++ все немного сложнее, поскольку у нас есть лямбды, объекты с operator()
и даже классом std::function
, но принцип в основном остается тем же.