Для чого потрібна '*' перед ім'ям функції?

Питання тут, скоріше, в тому, як читати проголошення функцій (та змінних) в 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 роки тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація