К каким типам относятся заданные функции?

#c

#c

Вопрос:

Эти 2 являются функциями.

 double *f1 (double* p);
double (*f2) (double *p);
 

К каким типам относятся эти две функции?

Комментарии:

1. Первая является функцией, а вторая — нет. Второй — указатель на функцию.

2. Хотя ответить на вопрос легко, я думаю, что будет более полезно добавить некоторый контекст. Что заставило вас задуматься о них? Как вы думаете, что это такое и почему вы так думаете? Вы пытались найти ответ самостоятельно?

Ответ №1:

Первая — это функция, которая возвращает двойной указатель. Второй — указатель на функцию, а не на функцию.

Общий синтаксис прототипа функции, возвращающей указатель, таков:

 <type> *<name>(<parameters>);
 

Общий синтаксис для указателя на функцию, который не является функцией, а является указателем на функцию, является:

 <type> (*<name>)(<parameters>);
 

Итак, что у вас есть, double (*f2) (double *p); это указатель на функцию, который может указывать на функцию, которая принимает a double *p в качестве входных данных и возвращает a double в качестве выходных данных. Это не похоже double *f1 (double* p); на то, что является прототипом для функции, которая принимает a double *p в качестве входных данных и возвращает a double * в качестве выходных данных.

Ответ №2:

f1 это функция, которая возвращает указатель на double . f2 является указателем на возвращаемую функцию double .

Каждое объявление читается следующим образом:

         f1                 –– f1
        f1 (         )     –– is a function taking
        f1 (        p)     ––   parameter p
        f1 (      * p)     ––   is a pointer to
        f1 (double* p)     ––     double
       *f1 (double* p)     –– returning a pointer to
double *f1 (double* p);    ––   double

         f2                –– f2
       (*f2)               –– is a pointer to
       (*f2) (         )   ––   a function taking
       (*f2) (        p)   ––     parameter p
       (*f2) (       *p)   ––     is a pointer to
       (*f2) (double *p)   ––       double
double (*f2) (double *p);  ––   returning double
 

Несмотря на свой внешний вид, f2 это не функция — это указатель, который хранит адрес другой функции.

Как в объявлениях, так и в выражениях операторы постфиксного [] индекса и () вызова функций имеют более высокий приоритет, чем унарный * , поэтому декларатор like *f() анализируется как *(f()) и объявляет функцию, возвращающую указатель. Чтобы объявить указатель на функцию или указатель на массив, необходимо явно сгруппировать * оператор с идентификатором:

 T *a[N];       // a is an array of pointer to T
T (*a)[N];     // a 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