Well, the first one is a pointer to a function. In other words, it declares a variable "x" which points to a function of the following type:
int function(int, char*, void*);
And could be used as follows:
int myfunc(int a, char* b, void* c) {
return a;
}
void acallingfunction() {
int (*x)(int, char*, void*);
x = myfunc;
x(1, "hello", 0);
}
The second appears to be invalid syntax, but I may be wrong. If it had an asterisk before the x (such as int (*x[10])(int, char*, void*) ), it would be an array of function pointers, and would be used like a normal array:
x[3](1, "Hi there", 0);
The third is an array of pointers to function pointers, which doesn't seem practical, but is perfectly valid. An example usage might be:
void anothercaller() {
int (*x)(int, char*, void*);
int (**y)(int, char*, void*);
x = myfunc;
y = &x;
(*y)(1, "hello", 0);
}
Note that of these, the first two are relatively common. Pointers to functions are used to accomplish callbacks and various Object-Oriented programming concepts in C. An array of pointers to functions might be used for an event table, to find the appropriate callback.
Note that all of those are, in fact, valid C++ as well. ;)
Edit: I committed the atrocities of void main() apparently.
Edit 2: As Chris Lutz points out below, they really should be wrapped in typedefs. Typedefs make code containing pointers to functions MUCH clearer.