Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.09.2013
Сообщений: 5

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

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

Студворк — интернет-сервис помощи студентам
Скажите, пожалуйста, что такое в С++ указатель на функцию) Сколько инфы не читал - ничего не понял.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2013, 17:30
Ответы с готовыми решениями:

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

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

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

8
 Аватар для HedgehogLu
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
04.10.2013, 18:31
Указатель на функцию - это... ммммм. Это указатель на функцию.
Например сложный калькулятор.
В нем есть разные функции косинусы синусы и т.д.
Допустим этим функциям всегда передается параметров число типа дабл.
т.о прототип функции будет таким
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
0 / 0 / 0
Регистрация: 29.09.2013
Сообщений: 5
04.10.2013, 18:42  [ТС]
Спасибо, попытаюсь осмыслить)
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
04.10.2013, 18:54
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 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
04.10.2013, 18:59
Да оба примера очень наглядно показывают где и как используются указатели на функции.
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
04.10.2013, 19:05
Цитата Сообщение от HedgehogLu Посмотреть сообщение
Да оба примера очень наглядно показывают где и как используются указатели на функции.
Я и не спорю, но у вас пример довольно сложен для восприятия, согласитесь
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
04.10.2013, 19:06
Цитата Сообщение от rebus7000 Посмотреть сообщение
что такое в С++ указатель на функцию
указатель - он и в Африке указатель
0
 Аватар для HedgehogLu
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
04.10.2013, 19:19
Ладно самое простое и понятное определение.
Указатель это переменная которая содержит адрес памяти в котором находятся данные того же типа как и указателя.
таким образом int* сдержит адрес памяти где содержатся данные типа int
Аналогично указатель на функцию содержит адрес где находится функция, точнее точка вызова этой функции.
Таким образом если для "обычных" типов данных по указателю мы получаем доступ к данным, то в случае с указателем на функции мы можем ее вызвать.
Вот собственно и все.
Все остальное это уже как следствие.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.10.2013, 21:46
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2013, 21:46
Помогаю со студенческими работами здесь

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){}; cоздаю на нее указатель. int...

Указатель на указатель массива для передачи в функцию/цикл
При написании программы в универе, столкнулся с проблемой короткого описания массива в цикле и в функциях. Проблема такая есть у меня...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru