Is the asterisk optional when calling a function pointer?
c, c++, function-pointers, language-lawyer
Solution
TL;DR
The rules in C and C++ are the same, there's no difference between the two.
What does the C++ Standard (n3797) say?
`5.2.2p1` Function call `[expr.call]`
A function call is a postfix expression followed by parentheses containing a possible empty, comma-separated list of initializer-clauses which constitute the arguments to the function.
The postfix expression shall have function type or pointer to function type.
What does the C standard (n1570) say?
`6.3.2.1p4` Lvalues, arrays, and function designators
A function designator is an expression that has function type. Except when it is the operand of the `sizeof` operator, the `_Alignof` operator, or the unary `&` operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".
`6.5.2.2p1` Function calls
The expression that denotes the called function shall have type pointer to function returning `void` or returning a complete object type other than an array type.
Conclusion?
How the rule are expressed differs between C++ and C. In C the implicit function-to-pointer conversion always applies when calling a function, whereas C++ states that the "postfix expression" could be either a pointer, or a variable of function type.
However; your question is if the two ways of calling a function through a pointer differs between C++ and C, and the answer is: No, there's no difference between `(1)`, `(2)`, and `(3)`, nor is there a difference between the two languages.
(*fptr)(123); // (1)
fptr(123); // (2)
(***fptr)(123); // (3)
Note: Be aware that the there's no difference between `(*fptr) (...)` and `fptr (...)` when it comes to calling a function, but that they can be vastly different in other contexts.
Problem
I couldn't find an answer to this anywhere. I just read K&R and saw them calling a function pointer like this: ``` (*ptr)(arg1, arg2); ``` I vividly remember, however, to have seen someone using them like this: ``` ptr(arg1, arg2); ``` That might have been in C++, though. - How are the rules? - Do they differ in C and C++?