Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Указатели на функцию


Автор: AlanG 16.5.2006, 14:05
Всем доброго времени суток.
Народ приведите кто нибуть простенький пример с узателями на функцию.
Читаю книгу, все вроде понятно, а  с примерами там ни чего нет. 

Автор: Fazil6 16.5.2006, 14:11
Код

void sort();   // имя ф-и ("sort") по сути и есть указатель на нее


typedef void (*FuncPointer)(); // новый тип указателя на функцию без возврата и без аргументов

FuncPointer func; //  func - переменная этого типа

func = &sort;  
  

Автор: threef 16.5.2006, 14:28
Код

typedef double // это тип результата 
            (*math )// это имя типа указателя на функцию
             ( double) // это список типов параметров

void tabulator( math f, double start, double finish, double step)
{
     while(start<finish)
     {
            cout<<start<<",\t"<<f(start)<<'\n';
            start+=step;
      }
            cout<<finish<<",\t"<<f(finish)<<'\n';      
}

double myf(double x)
{
     if(x!=0.)
      return sin(x)/x;
     else return 0;
}

main()
{
     tabulator(sin, 0.90*3.14/180,  5*3.14/180); //0-90 градусов через 5 градусов
     tabulator(cos, 0.90*3.14/180,  5*3.14/180); //0-90 градусов через 5 градусов
     tabulator(myf, 0.90*3.14/180,  5*3.14/180); //0-90 градусов через 5 градусов

}
 

Автор: AlanG 16.5.2006, 14:36
Мда smile . Сложновато разобратся без объяснений. 

Автор: likehood 16.5.2006, 15:45
Код

int f1(int n) {
    return n*n;
}
int f2(int n) {
    return 2*n;
}

void main()
{
    int  (*pf)(int); // pf - указатель на ф-ю, принимающую один параметр int и возвращую int
    pf = &f1;
    cout << pf(3) << endl; // выведется 9
    pf = &f2;
    cout << pf(3) << endl; // выведется 6, т.е. один и тот же код дает разный результат,
    // смотря на какую ф-ю указывает pf
}
 

Автор: nikitao 16.5.2006, 15:55
AlanG, лучше обьясни ,что тебе не понятно изходя из преведенных примеров. 

Автор: AlanG 16.5.2006, 18:02
Цитата

void main()
{
    int  (*pf)(int); // pf - указатель на ф-ю, принимающую один параметр int и возвращую int
    pf = &f1;
    cout << pf(3) << endl; // выведется 9
    pf = &f2;
    cout << pf(3) << endl; // выведется 6, т.е. один и тот же код дает разный результат,
    // смотря на какую ф-ю указывает pf
}


Цитата

pf = &f1;

Указателю передается значение функции f1, при этом функция еще не вызывается, значит передается не значение, а что?
и далее  используется указатель, и соответсятвенно вызов функции? Но конструкция пока для меня  непонятная
Цитата

cout << pf(3) << endl; // выведется 9


 

Автор: bsa 16.5.2006, 18:12
& - это получение адреса в C (раздел указатели перечитай)
cout <<  - это конструкция из c++ - вывод чего либо в стандартный вывод

Добавлено @ 18:14 
Соответственно cout << f(3) << endl - выводит результат выполнения функции f с параметром 3, а затем символ конца строки (endl = "\n"). 

Автор: threef 16.5.2006, 18:25
имя функции является одновременно ее адресом. Присвоив имя функции указателю на функцию ты можешь использовать этот указатель для вызова функции

Код

...
double (*pointer)(double); // указатель на функцию
pointer = sqrt; // получаем адрес sqrt
cout<<pointer(9); // вычисляем sqrt(9)

pointer=sin;
cout<<pointer(3.14/2); // вычисляем sin(PI/2) 

 

Автор: UnrealMan 16.5.2006, 21:42
Цитата(threef @  16.5.2006,  18:25 Найти цитируемый пост)
имя функции является одновременно ее адресом

Вот только если функция перегруженная... :-) 

Автор: MAKCim 16.5.2006, 21:45
Цитата

Вот только если функция перегруженная... :-)  

компилятор добавляет обычно к имени ф-ии некоторые данные исходя из параметров, посему если перегрузка выполнена правильно, ф-ия будет иметь уникальное имя а значит и адрес 

Автор: AlanG 17.5.2006, 10:02
Все понятно, спасибо smile .
Я все-таки решил поменять книгу, надеюсь что больше глупыми вопросами надоедать не буду smile . 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)