Ответ 1
Это просто причуда C. Нет другой причины, но стандарт C просто говорит о том, что разыменование или принятие адреса функции просто оценивает указатель на эту функцию, а разыменование указателя функции просто возвращает обратно к функции указатель.
Это поведение (очевидно, очевидно) сильно отличается от того, как работают унарные операторы &
и *
для нормальных переменных.
Итак,
test2 = myprint;
test2 = &myprint;
test2 = *myprint;
test2 = **********myprint;
Все просто делают то же самое, дает вам указатель на myprint
Аналогично,
test2(s);
(*test2)(s);
(***********test2)(s);
То же самое, вызовите указатель функции, сохраненный в test2
. Потому что C говорит, что делает.