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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
rebus7000
0 / 0 / 0
Регистрация: 29.09.2013
Сообщений: 5
#1

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

04.10.2013, 17:30. Просмотров 526. Ответов 8
Метки нет (Все метки)

Скажите, пожалуйста, что такое в С++ указатель на функцию) Сколько инфы не читал - ничего не понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2013, 17:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на функцию (C++):

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель - C++
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Передать в неуправляемую функцию указатель на указатель - C++
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

Указатель на функцию возвращающую указатель - C++
Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в которой встречается указатель на функцию, принимающую параметр...

8
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
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);
//просто используя их указатель
}
1
rebus7000
0 / 0 / 0
Регистрация: 29.09.2013
Сообщений: 5
04.10.2013, 18:42  [ТС] #3
Спасибо, попытаюсь осмыслить)
0
gromo
371 / 270 / 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;
}
0
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
04.10.2013, 18:59 #5
Да оба примера очень наглядно показывают где и как используются указатели на функции.
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
04.10.2013, 19:05 #6
Цитата Сообщение от HedgehogLu Посмотреть сообщение
Да оба примера очень наглядно показывают где и как используются указатели на функции.
Я и не спорю, но у вас пример довольно сложен для восприятия, согласитесь
0
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
04.10.2013, 19:06 #7
Цитата Сообщение от rebus7000 Посмотреть сообщение
что такое в С++ указатель на функцию
указатель - он и в Африке указатель
0
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
04.10.2013, 19:19 #8
Ладно самое простое и понятное определение.
Указатель это переменная которая содержит адрес памяти в котором находятся данные того же типа как и указателя.
таким образом int* сдержит адрес памяти где содержатся данные типа int
Аналогично указатель на функцию содержит адрес где находится функция, точнее точка вызова этой функции.
Таким образом если для "обычных" типов данных по указателю мы получаем доступ к данным, то в случае с указателем на функции мы можем ее вызвать.
Вот собственно и все.
Все остальное это уже как следствие.
0
alsav22
5425 / 4820 / 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;
1
04.10.2013, 21:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2013, 21:46
Привет! Вот еще темы с ответами:

Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) - C++
Подскажите как передать указатель на файл в функцию, как вернуть указатель на файл из функции. void Open() // из этой функции вернуть...

Как передать параметр типа "указатель на указатель" в функцию? - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; #include &lt;iomanip&gt; using std::setiosflags; ...

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? - C++
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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