TL; DR
Правила в C и C ++ одинаковы, между ними нет никакой разницы.
Что означает C ++ Standard ( n3797 ) say?
5.2.2p1
Вызов функции[expr.call]
Вызов функции - это постфиксное выражение, за которым следуют скобки, содержащие возможные пустые, разделенный запятыми список инициализатор-предложений, которые составляют аргументы функции.
Постфиксное выражение должно иметь тип функции или указатель на тип функции.
blockquote> blockquote>Что означает стандарт C ( n1570 )?
6.3.2.1p4
Lvalues, массивы и указатели функцийОбозначение функции - это выражение, которое имеет тип функции. За исключением случаев, когда он является операндом оператора
blockquote> blockquote>sizeof
, оператор_Alignof
или унарный оператор&
, обозначение функции с функцией типа «возвращение функции » преобразуется в выражение, которое имеет тип "указатель на функцию, возвращающую тип ".
6.5.2.2p1
Функциональные вызовыВыражение, которое обозначает вызываемую функцию, должно иметь указатель на функцию, возвращающую функцию
blockquote> blockquote>void
или возвращающий полный тип объекта, отличный от типа массива.Заключение?
Как правило выражается, различаются между C ++ и C. В C неизменное преобразование function-to-pointer всегда применяется при вызове функции , тогда как в C ++ указано, что выражение postfix " может быть либо указателем, либо переменной типа функции.
Однако; ваш вопрос заключается в том, что два способа вызова функции через указатель различаются между C ++ и C, и ответ таков: нет, нет разницы между
(1)
,(2)
и(3)
, и нет никакой разницы между два языка.(*fptr)(123); // (1)
fptr(123); // (2)
(***fptr)(123); // (3)
Примечание: имейте в виду, что нет разницы между
(*fptr) (...)
иfptr (...)
, когда дело доходит до вызова функции, но что они могут быть значительно разными в других контекстах.