I've seen different methods used for calling functions via pointers. What's the story?
Originally, a pointer to a function had to be ``turned into'' a ``real'' function, with the * operator (and an extra pair of parentheses, to keep the precedence straight), before calling:
int r, func(), (*fp)() = func; r = (*fp)();
It can also be argued that functions are always called via pointers, and that ``real'' function names always decay implicitly into pointers (in expressions, as they do in initializations; see question 1.34). This reasoning, made widespread through pcc and adopted in the ANSI standard, means that
r = fp();is legal and works correctly, whether fp is the name of a function or a pointer to one. (The usage has always been unambiguous; there is nothing you ever could have done with a function pointer followed by an argument list except call the function pointed to.) An explicit * is still allowed (and recommended, if portability to older compilers is important).
See also question 1.34.
References:
K&R1 Sec. 5.12 p. 116
K&R2 Sec. 5.11 p. 120
ANSI Sec. 3.3.2.2
ISO Sec. 6.3.2.2
Rationale Sec. 3.3.2.2
H&S Sec. 5.8 p. 147, Sec. 7.4.3 p. 190
Read sequentially: prev next up top
This page by Steve Summit // Copyright 1995 // mail feedback