Во-первых, декларация, которую вы показываете, неверна.Не удивительно, учитывая, насколько сложным может быть синтаксис объявления в Си.Если вам нужен массив указателей на функции (что я сильно подозреваю), тогда необработанное написание выглядит следующим образом:
int *(*functions_array[4])();
Не намного более читабельно, но, по крайней мере, синтаксически правильно.Теперь вы можете индексировать его, чтобы получить указатель на функцию для вашего использования.Например:
functions_array[0] = function;
functions_array[0](); // Call the function
Но если вы действительно хотели указатель на массив (по причинам, которые я не могу понять), необработанный декларатор выглядит так:
int *(*(*functions_array_p)[4])();
С теперь менеепривлекательная индексация для соответствия:
(*functions_array_p)[0] = function;
(*functions_array_p)[0](); // Call the function
Скобки требуются из-за обычного приоритета *
и []
.
Но способ сделать работу с ней и определить ее проще, путем введения псевдонимов некоторых типов.Прежде всего, для типа функции:
typedef int* function_type();
Теперь объявление массива принимает эту гораздо более читаемую форму:
function_type* functions_array[4];
Звездочка в поле зрения в целом соответствует обычной практике нескрытие семантики указателя.
А для указателя на массив:
function_type* (*functions_array)[4];
Декларатор по-прежнему выглядит довольно регулярно.
1.Кроме того, пустой список параметров в объявлении функции C не означает, что функция не принимает аргументов.Это устаревшая функция, обеспечивающая функцию без прототипа.Путь вперед - (void)
.