Форум программистов, компьютерный форум CyberForum.ru

Указатель на функцию - C++

Войти
Регистрация
Восстановить пароль
 
rebus7000
0 / 0 / 0
Регистрация: 29.09.2013
Сообщений: 5
04.10.2013, 17:30     Указатель на функцию #1
Скажите, пожалуйста, что такое в С++ указатель на функцию) Сколько инфы не читал - ничего не понял.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2013, 17:30     Указатель на функцию
Посмотрите здесь:

Указатель на функцию C++
C++ указатель на функцию
Указатель на функцию C++
C++ Указатель на функцию
указатель на функцию C++
C++ Указатель на функцию
указатель на функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HedgehogLu
 Аватар для HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 254
04.10.2013, 18:31     Указатель на функцию #2
Указатель на функцию - это... ммммм. Это указатель на функцию.
Например сложный калькулятор.
В нем есть разные функции косинусы синусы и т.д.
Допустим этим функциям всегда передается параметров число типа дабл.
т.о прототип функции будет таким
C++
1
double myfunc(double);
пусть у нас есть описанная функция косинуса
C++
1
2
3
4
double cos(double x) {
.....
return result;
}
Таким образом мы для удобства вызова этих функций согласно их символьным названиям можем создать массив следующих структур.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct funcstr
{
  char *name;
  double (*func)(double);     
 };
....
//
funcstr functable[10]=
{"cos",&cos,....
....
"tg",&tg};
 
....
//тогда вызывать функции можно следующим образом
functable[i].func(x);
//просто используя их указатель
}
rebus7000
0 / 0 / 0
Регистрация: 29.09.2013
Сообщений: 5
04.10.2013, 18:42  [ТС]     Указатель на функцию #3
Спасибо, попытаюсь осмыслить)
gromo
 Аватар для gromo
367 / 266 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
04.10.2013, 18:54     Указатель на функцию #4
rebus7000, еще можно так осмыслить:
Например, есть такой алгоритм в стандартной библиотеке, как sort(iter_begin, iter_end, [pointer_to_func p]);
Так вот, необязательный параметр "р" - это может быть указатель на функцию, которая выполняет нужный вид сравнения ключей в массиве. Т.е. алгоритм sort() реализует семантику перебора диапазона [iter_begin; iter_end), а функция, адресуемая "р" уже определяет результат сравнения элементов из этого диапазона (например слова можно сортировать по длине, по алфавиту, натурально и т.д.)

Добавлено через 3 минуты
Пример. Только здесь вдобавок к функции еще и демонстрируется аналогичное использование функционального объекта, потому что их семантика одинакова
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector
 
bool myfunction (int i,int j) { return (i<j); }
 
struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;
 
int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33
 
  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33
 
  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
 
  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)
 
  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';
 
  return 0;
}
HedgehogLu
 Аватар для HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 254
04.10.2013, 18:59     Указатель на функцию #5
Да оба примера очень наглядно показывают где и как используются указатели на функции.
gromo
 Аватар для gromo
367 / 266 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
04.10.2013, 19:05     Указатель на функцию #6
Цитата Сообщение от HedgehogLu Посмотреть сообщение
Да оба примера очень наглядно показывают где и как используются указатели на функции.
Я и не спорю, но у вас пример довольно сложен для восприятия, согласитесь
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
04.10.2013, 19:06     Указатель на функцию #7
Цитата Сообщение от rebus7000 Посмотреть сообщение
что такое в С++ указатель на функцию
указатель - он и в Африке указатель
HedgehogLu
 Аватар для HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 254
04.10.2013, 19:19     Указатель на функцию #8
Ладно самое простое и понятное определение.
Указатель это переменная которая содержит адрес памяти в котором находятся данные того же типа как и указателя.
таким образом int* сдержит адрес памяти где содержатся данные типа int
Аналогично указатель на функцию содержит адрес где находится функция, точнее точка вызова этой функции.
Таким образом если для "обычных" типов данных по указателю мы получаем доступ к данным, то в случае с указателем на функции мы можем ее вызвать.
Вот собственно и все.
Все остальное это уже как следствие.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2013, 21:46     Указатель на функцию
Еще ссылки по теме:

Указатель на функцию C++
C++ Указатель на функцию, С++
C++ Указатель на функцию
C++ Указатель на функцию
C++ Указатель на функцию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 21:46     Указатель на функцию #9
rebus7000, предположим, есть у вас три функции:
C++
1
2
3
int f1(int);
int f2(int);
int f3(int);
Чтобы получить указатель на такие функции, нужно взять прототип одной из них и слегка изменить:
C++
1
int (*f)(int); // f - указатель на функцию, которая принимает один int и возвращает int
Теперь можно делать так:
C++
1
2
3
4
5
6
7
8
f = f1;
f(3); // вызов f1;
    
f = f2;
f(4); // вызов f2;
    
f = f3;
f(5); // вызов f3;
Yandex
Объявления
04.10.2013, 21:46     Указатель на функцию
Ответ Создать тему
Опции темы

Текущее время: 09:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru