Ну, первый - это указатель на функцию. Другими словами, он объявляет переменную «x», которая указывает на функцию следующего типа:
int function(int, char*, void*);
И может использоваться следующим образом:
int myfunc(int a, char* b, void* c) {
return a;
}
void acallingfunction() {
int (*x)(int, char*, void*);
x = myfunc;
x(1, "hello", 0);
}
Второй, похоже, неверный синтаксис, но я могу ошибаться. Если бы он имел звездочку перед x (например, int (* x [10]) (int, char *, void *)), это был бы массив указателей на функции, и он использовался бы как обычный массив:
x[3](1, "Hi there", 0);
Третий - это массив указателей на указатели на функции, который не кажется практичным, но вполне допустим. Пример использования может быть:
void anothercaller() {
int (*x)(int, char*, void*);
int (**y)(int, char*, void*);
x = myfunc;
y = &x;
(*y)(1, "hello", 0);
}
Обратите внимание, что из них первые два относительно распространены. Указатели на функции используются для выполнения обратных вызовов и различных концепций объектно-ориентированного программирования на языке C. Массив указателей на функции может использоваться для таблицы событий, чтобы найти соответствующий обратный вызов.
Обратите внимание, что все они, по сути, также являются допустимыми C ++. ;)
Редактировать: Я совершил зверства void main (), по-видимому.
Редактировать 2: Как указывает Крис Латс ниже, они действительно должны быть заключены в typedefs. Typedefs делают код, содержащий указатели на функции, НАМНОГО понятнее.