Декларация гласит:
func — func
*func — is a pointer to
(*func)( ) — a function taking
(*func)(void) — no parameters
void (*func)(void) — returning void
Указатель func
затем инициализируется результатом вызова dlsym
, который возвращает адрес функции ”function
”в библиотеке list0513.so
.
Общие правила объявления для типов указателей:
T *p; // p is a pointer to T
T *p[N]; // p is an array of pointer to T
T (*p)[N]; // p is a pointer to an array of T
T *f(); // f is a function returning a pointer to T
T (*f)(); // f is a pointer to a function returning T
Как в объявлениях, так и в выражениях операторы постфикса []
subscript и ()
function имеют более высокий приоритет, чем унарный *
, поэтому *f()
анализируется как *(f())
(функция, возвращающая указатель). Чтобы объявить указатель на массив или функцию, *
должен быть явно сгруппирован с декларатором массива или функции.
Объявления могут быть довольно сложными - вы можете иметь массив указателей на функции:
T (*a[N])(); // a is an array of pointers to functions returning T
или функции, возвращающие указатели на массивы:
T (*f())[N]; // f is a function returning a pointer to an array
или даже указатели на массивы указателей на функции, возвращающие указатели на массивы:
T (*(*(*a)[N])())[M];
Вы, вероятно, не увидите ничего такого, что волосатое в дикой природе, хотя (если вы не наткнетесь на мой старый код).