Логика вызова функции с помощью «Указатель на функцию» - PullRequest
0 голосов
/ 02 марта 2019

Предположим, есть указатель 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 Ответ

0 голосов
/ 02 марта 2019

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

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

...