Логика вызова функции с помощью "Указатель на функцию"
Предположим, есть указатель 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
является либо указателем на функцию, либо однонаправленной функцией (если это указатель на указатель на функцию, вам нужен хотя бы один *
и так далее для кратных косвенных указателей).