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