As an aside, the reason for this bizarre asymmetry is historic.
In Ancient (or "K&R 1st Edition") C, there were no prototypes.
There were only declarations. If f() always required exactly three
arguments, and then returned a value of type "int *", one had to
write:
int *f();
int main(void) {
int *p1, *p2;
p1 = f(1, "23", 456.789);
...
}
This meant that C compilers in general could not check the actual
arguments. Here f() needs exactly three; obviously the first is
an "int", the second a "char *", and the third a "double". But in
K&R-1 C, if you accidentally called it improperly:
p2 = f("oops");
the compiler silently accepted it, and your code bombed out at
runtime (if you were lucky; if you were unlucky it ran anyway,
and did ... something, but who knows what).
In 1989, the original ANSI C standard adopted the newfangled
"prototype" declarations from C++ (or what was C++ at that time,
which was a language that is almost but not entirely unlike today's
C++

). To declare that f() took exactly three arguments, of
type "int", "char *", and "double", and returned "int *", one now
wrote:
int *f(int, char *, double);
However, ANSI C had to permit the old-style non-prototype declaration,
using it to mean: "We know what kind of value f() returns, but we
have no idea how many arguments it takes, so just accept whatever
the programmer puts in there and hope he gets it right."
That left a problem: if "int *f();" meant "f() takes some unknown
number of arguments, so hope the programmer gets it right", how
could a programmer say "f() takes NO arguments, and I want you,
Mr Compiler, to complain if I accidentally get this wrong"?
The answer was to add this "(void)" syntax. As a very special
case, if you wanted to write a prototype declaration for f()
and say "this function takes no arguments, NONE AT ALL EVER
thank you very much", you had to write:
int *f(void);
The "void" filled in the empty space, without putting anything
"real" in there. Now the C compiler could tell the difference
between "programmer did not say" and "programmer did say, and
he said `there must be nothing'".
C++ never required the "void", because C++ always had prototypes,
so "int *f()" always meant "f() takes no arguments".
When the X3J11 (ANSI C) committee invented this new "f(void)"
thing, they could have, but did not, change the syntax of actual
calls to permit a (useless) "void" keyword in calls as well.
So:
int *f(void);
is a prototype saying "f() takes no arguments", and:
int *ip = f();
contains a correct call to f(), supplying those "no arguments".