#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