Возврат указателя. Указатель на функцию

Рейтинг: 1Ответов: 2Опубликовано: 05.11.2014

Доброго времени.

Помогите разобраться, а то я запутался. Перечитал достаточно литературы, но в голове каша. Был бы очень благодарен, если бы объяснили эти моменты (если не затруднит, привести пример):

1) зачем возвращать указатель и как оперировать с ним дальше можно? Касательно возврата на начало строки.

Ticket* zapolnenie (Ticket *T)
{
return *T
}

2) вот, что пишут в книге:

double (*pf)(int);//pf указывает на ф-ю, которая возвращает значение типа double

double *pf(int);//pf() является ф-ей, которая возвращает указатель на значение типа double

Обновление

@KoVadim, gо поводу первого, написал код, но смысл использования может быть такой?

char *ref(char *ch, int i);
 int main()
{
int i=3;
 char c[6]="Hello";
cout<<*ref(c,i);
return 0;
}
char *ref(char *ch, int i){
return &ch[i];}
//////////////////

Зачем передавать функции указатель для сравнивания строк, если его можно использовать внутри функции, написав strcmp()?

void check(char *a, char *b, int (*cmp) (const char *, const char *));
    int (*p) (const char*, const char*);
    p = strcmp;
    check(s1, s2, p);

Ответы

▲ 3Принят

Вас интересует, зачем возвращать указатель на функцию? Очевидно же, чтобы вызвать позже. Очень хороший пример - это функция сортировки, которой нужно передать указатель на массив и функцию, которая умеет сравнивать два элемента (ну, и ещё размер элемента). Имея этот указатель, функция может сравнивать элементы и, соответственно, отсортировать их.

Обновление

Допустим, Вы пишете код, который проверяет, есть ли строка в массиве. Все хорошо работает, но в один день выясняется, что нужно уметь сравнивать, не учитывая регистр. Ок, дописываете ещё один параметр "bool case_sensetive". Через неделю выясняется, что неплохо, ещё уметь сравнивать строки, если они находятся в разных формах (морфологическое сравнение).

Через несколько месяцев получается, что количество параметров превышает все допустимые пределы, а сама функция разрастается в разы. Вот здесь указатель на функцию сравнения строк и нужен.

▲ 3

На примере той же сортировки - если передавать в функцию сортировки указатель на функцию-"компаратор", то с помощью этой (одной единственной) функции сортировки можно будет сортировать не только, к примеру, строки, но и практически любые другие структуры данных, меняя только один параметр, а не создавать ("копипастить") под каждую структуру данных новую функцию сортировки.

Главное преимущество такого подхода - код становится более универсальным. С другой стороны, если вы пишете "одноразовый" код, т.е. код, который скорее всего не будете использовать повторно, либо расширять, то никаких особых преимуществ передача указателя на функцию скорее всего не даст.

callback-функция - это и есть та функция, указатель на которую передается в другую функцию (или еще куда-то).