Логика вызова функции с помощью "Указатель на функцию"

Предположим, есть указатель f объявил какую-то функцию сказать int foo(int) как:

int (*f)(int)=foo;

При упоминании о звонке foo() функция с помощью этого понтера, который передается в качестве аргумента какой-то другой функции. Я сталкивался с заявлением о том, что оба

y=(*f)(x) а также

y=f(x)

одинаковы в C и вызывает функцию foo()....(x и y имеют тип int).

Для массивов я знаю, что если p является указателем на любой массив a.

p[i]=*(p+i)=*(&a[0]+i)=*(a+i)=a[i],

Итак, написание p[i] а также *(p+i) это одно и то же. Но я не получу логику для случая "указатель на функцию". Как y=(*f)(x) а также y=f(x) такие же? Есть ли какая-нибудь формула, чтобы понять это так, как в случае "указателя на массив"?

1 ответ

До ANSI C требовалось, чтобы вы разыменовывали указатели на функции перед их вызовом.

Когда C становился стандартизированным, люди понимали, что с указателем на функцию вы ничего не могли поделать, кроме как вызывать ее (арифметика указателей не имеет смысла для указателей на функции - указатели на функции указывают на блоки инструкций сборки, длина которых зависит на конкретную функцию, а не на тип функции. Это также причина, по которой у вас не может быть массивов функций), поэтому f(x) был сделан эквивалентным (*f)(x) (или даже (****f)(x) или же (**&**f)(x) и различные другие комбинации) до тех пор, пока f является либо указателем на функцию, либо однонаправленной функцией (если это указатель на указатель на функцию, вам нужен хотя бы один * и так далее для кратных косвенных указателей).

Другие вопросы по тегам