Для чого потрібна '*' перед ім'ям функції?
Питання тут, скоріше, в тому, як читати проголошення функцій (та змінних) в C. Історично склалося, що це дещо заплутано. Базове правило: читаємо від ідентифікатора, який визначається, спершу в дужках, потім праворуч, потім ліворуч; але групи ключових слів читаються разом зліва направо. Отже,
const double * f1(const double ar[], int n);
f1 - це функція, що приймає (список параметрів const double ar[], int n
) - далі праворуч нема куди, читаєм ліворуч - яка повертає *
- вказівник на const double
.
const double * (* func_ptr)(const double *, int);
func_ptr
- це:
*
- вказівник на
(const double *, int)
- функцію, що приймає параметри такого типу
*
- і повертає вказівник на
const double
int *ptr_array[10];
ptr_array - це масив вказівників на int.
int (*ptr_to_array)[10];
ptr_to_array - це вказівник на масив з 10 int-ів.
int (*func_array[10])(int x);
func_array - це
[10]
- масив з 10
*
- вказівників на
(int x)
- функції, що приймають int
int
- і повертають int.
int(*(*func_array1[10])(int x))(int);
func_array1 - це
[10]
- масив з 10
*
- вказівників на
(int x)
- функції, що приймають int
*
- і повертають вказівник
(int)
- на функцію, що приймає int
int
- і повертає int.
Через ці всі складнощі наполегливо раджу все, складніше за дві базові конструкції, проголошувати окремими типами за допомогою typedef
або (в C++) using
:
typedef int (*IntFunc)(int x);
IntFunc - це вказівник на функцію, що приймає int та повертає int
IntFunc func_array[10];
typedef IntFunc IntFuncGetter(int);
IntFuncGetter func_array1[10];
func_array та func_array1 визначені так само, як і раніше, але значно читаніше.
Якщо ви зуміли дочитати до цього місця, то, гадаю, вам уже не буде проблемою прочитати визначення функцій у питанні.
Pavloslav · 3 роки тому
Ще немає коментарів