Для чего нужен Символ * перед именем функции?
const double * f1(const double ar[], int n);
const double * f2(const double * ar, int n);
const double * f3(const double [], int);
const double * f4(const double *, int);
Добрый день, изучаю указатели на функции. Все эти функции принимают массив и его длину. arr представляет адрес массива. К параметрам вопросов нет. Подскажите пожалуйста:
- для чего нужна
*передf1, f2, f3, f4. *может встречаться только в прототипах или в определении функции тоже?*(указатель)указывает на возвращаемый тип функции?
Где можно почитать конкретно про такие случаи? Буду очень благодарен за ответ.
Ответы (2 шт):
Функция описывается так:
возвращаемый_тип имя_функции([тип1 аргумент1 [, тип2 fргумент2] ...)
Так что в
const double * f2(const double * ar, int n);
const double * - возвращаемый тип, f2 - имя функции, const double * - тип первого аргумента ar, int - тип второго аргумента n.
Так понятнее?
На второй вопрос - "прототип" и определение должны совпадать (кроме, разве что, имен аргументов), так что * нужна точно так же, чтобы указывать возвращаемый тип.
Почитать обо все этом можно в учебниках по C++.
P.S. К вашему
изучаю указатели на функции
Указатель на функцию данного типа будет иметь вид
const double * (* func_ptr)(const double *, int);
Все эти функции возвращают указатели на массивы вещественных чисел. Как Вы, наверное, знаете (или можете узнать отсюда) указатель в С++ это такой тип данных, который хранит адрес в памяти, а указатель на массив — указывает туда, где хранится его первый элемент или, правильнее сказать хранит в себе адрес первого элемента массива. (Первый это тот, у которого индекс = 0).
Если звездочку в прототипе не указывать, то функция будет возвращать не адрес по которому хранится double, а само значение double. Чем они отличаются, думаю понятно, но если нет, то можно почитать лекцию. Правда там СИ, а не С++
Про указатели на функции: Указатели на функции указывают на (хранят в себе адрес) функций. То есть когда мы вызываем какую-то функцию, программа переходит ее по адресу и начинает ее выполнять.
Объявить указатель на функцию можно так:
int foo (){
return 7;
} // сама функция
int main(){
int (*fooPtr ()) = foo; // указатель на foo
}
Почитать про указатели на функции можно тут