Из стандарта C ( n1256 ):
6.7.5.3 Объявление функций (включая прототипы)
1010 * Ограничения *
1 Декларатор функции не должен указывать тип возврата, который является типом функции или массивом
тип.
Функции не могут возвращать типы массивов или другие типы функций. Функции могут возвращать указатели на эти типы, хотя:
int (*func(void))[5];
Синтаксис выглядит немного странно, но он разбивается следующим образом:
func -- func
func(void) -- is a function taking no parameters
*func(void) -- returning a pointer
(*func(void))[5] -- to a 5-element array
int (*func(void))[5] -- of int
Это не так полезно, как кажется: если вы попытаетесь вернуть указатель на локальный массив, такой как
int (*func(void))[5]
{
int arr[5] = {0,1,2,3,4};
return &arr;
}
массив больше не существует , когда функция возвращается; возвращаемое вами значение указателя больше не будет указывать на что-либо значимое.
Если вы пытаетесь создать массив функций , у вас есть похожая проблема; у вас не может быть массива типов функций (пункт 6.7.5.2, пункт 1, который включает предложение «Тип элемента не должен быть неполным или типом функции»), хотя вы можете иметь массив из указателей на функции:
int (*func[5])(void);
Это разбивается как
func -- func
func[5] -- is a 5-element array
*func[5] -- of pointers
(*func[5])(void) -- to functions taking no parameters
int (*func[5])(void) -- and returning int
* +1039 * Пример:
int f0(void) { return 0; }
int f1(void) { return 1; }
int f2(void) { return 2; }
int f3(void) { return 3; }
int f4(void) { return 4; }
int main(void)
{
int (*func[5])(void) = {f0, f1, f2, f3, f4};
int i;
for (i = 0; i < 5; i++)
printf("f%d = %d\n", i, (*func[i])()); // or just func[i]()
return 0;
}