Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
 Аватар для HamsterGamer
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201

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

17.06.2021, 00:49. Показов 3430. Ответов 35
Метки нет (Все метки)

Как должна выглядеть сигнатура функции на которую может указывать этот указатель?
C++
1
int (*(*ptr_f)())[42];
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.06.2021, 00:49
Ответы с готовыми решениями:

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

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

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

35
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
19.06.2021, 14:19
А что насчёт этих кошерных и милых глазу штук?

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
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <functional>
 
bool foo(int x)
{
    return x & 1;
}
 
void bar(int x, std::function<bool(int)> func)
{
    std::cout << ( func(x) ? "ODD" : "EVE" ) << "\n\n";
}
 
using mafuna = std::function<bool(int)>;
 
struct A
{
    void foo(mafuna func, int x)
    {
        std::cout << ( func(x) ? "ODD" : "EVE" ) << "\n\n";
    }
};
 
template <typename FOO>
void goo(FOO f)
{
    std::cout << f(5);
}
 
int main() 
{
    bar(16, foo);
 
    auto mmf = std::mem_fn(&A::foo);
    A a;
    mmf(a, foo, 233);
    goo(foo);
 
    system("pause");
    return 0;
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.06.2021, 14:26
Цитата Сообщение от alexbmd Посмотреть сообщение
и как объявлять потом подобную функцию ?
Я же показал как:
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
Print& foo(Print&);
Цитата Сообщение от alexbmd Посмотреть сообщение
someFn(Print&()(Print&) n) ?
Вот интересно, вам выше только что объяснили где ставить идентификатор у такого типа (по центру), а вы зачем его все равно поставили в конец?

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

Т.е. да, можно написать так:
C++
1
2
3
void someFn(foo_t n)
{
}
Но означать это будет:
C++
1
2
3
void someFn(foo_t* n)
{
}
Или (если развернуть)
C++
1
2
3
void someFn(Print& n(Print&))
{
}
Что на самом деле означает
C++
1
2
3
void someFn(Print& (*n)(Print&))
{
}
Еще один тип ведет себя подобным образом - массив. Когда мы, например, пишем:
C++
1
2
3
void someFn(int n[120])
{
}
Это на самом деле означает
C++
1
2
3
void someFn(int* n)
{
}
Добавлено через 2 минуты
Цитата Сообщение от Folian Посмотреть сообщение
А что насчёт этих кошерных и милых глазу штук?
А что насчет них?

Если обратите внимание, то параметром шаблона std::function как раз выступает тип функции.
Т.е. на примере ТС будет так:
C++
1
std::function<Print&(Print&)> func
так что без понимания все равно не получится этим всем полноценно пользоваться.
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
19.06.2021, 14:53
Цитата Сообщение от DrOffset Посмотреть сообщение
Если обратите внимание, то параметром шаблона std::function как раз выступает тип функции.
Т.е. на примере ТС будет так:
Конечно, но выглядит же нагляднее чем указатель; я к тому что их никто не упомянул - мож потому что подводные камни есть?
Цитата Сообщение от DrOffset Посмотреть сообщение
так что без понимания все равно не получится этим всем полноценно пользоваться.
Я вижу возвр. тип и аргументы - довольнол наглядно ж и ассоциативно, подвоха не вижу
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.06.2021, 15:02
Цитата Сообщение от Folian Посмотреть сообщение
я к тому что их никто не упомянул - мож потому что подводные камни есть?
Потому что это к теме мало относится.
В смысле эта тема про синтаксис этих объявлений.

Цитата Сообщение от Folian Посмотреть сообщение
довольнол наглядно ж и ассоциативно, подвоха не вижу
Ну возьмите объявление из стартового поста. И попробуйте его использовать с std::function
C++
1
std::function<int (*())[42]> func;
Намного проще стало? Вот именно. Разбираться в этом все равно нужно, что std::function, что без.

Так что тема именно об этом, о том, чтобы разобраться. А уж std::function заюзать много проблем не составит.
2
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
19.06.2021, 15:14
Цитата Сообщение от DrOffset Посмотреть сообщение
Намного проще стало?
Вообще-то да, проще ж повыкидывать имена, чем что-то дописывать, но эт субъективно.
Цитата Сообщение от DrOffset Посмотреть сообщение
Так что тема именно об этом, о том, чтобы разобраться. А уж std::function заюзать много проблем не составит.
Понял, не тот я самовар в гараж принёс
А разбираться нужно, эт да.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.06.2021, 15:22
Цитата Сообщение от Folian Посмотреть сообщение
проще ж повыкидывать имена
Если знать как это сделать?
Я не думаю, что автор сходу сейчас смог бы адаптировать это объявление под использование с std::function. И тут мы опять возвращаемся к исходному тезису, что сначала надо изучить как это все работает.
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
19.06.2021, 16:31
Цитата Сообщение от DrOffset Посмотреть сообщение
все равно поставили в конец
извеняюсь , многолетняя привычка
Цитата Сообщение от DrOffset Посмотреть сообщение
void someFn(Print& (*n)(Print&))
а почему происходит скрытое приведение к указателю ? и раз уж происходит приведение то почему например не к ссылке ?

и вот только что нашёл открытие для себя
int *(*pf)(int, char) (&f);
инициализация указателя без = и оно работает.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.06.2021, 16:40
Цитата Сообщение от alexbmd Посмотреть сообщение
инициализация указателя без =
Ну да, в С++ запись
C++
1
int a(0);
это инициализация переменной a нулём... А вот
C++
1
int a();
уже объявление функции. Поэтому если нам нужна инициализация переменной конструктором по-умолчанию, нужно писать
C++
1
int a;
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
19.06.2021, 16:56
Цитата Сообщение от TRam_ Посмотреть сообщение
Или она же
используя линк DrOffset читаю
int (*(*f)())[42] - f это указатель на функцию возращяющую указатель на массив из int
int (*f())[42] - f это функция возращяющую указатель на массив из int

пропал один указатель. почему тогда это одно и тоже ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.06.2021, 18:33
Цитата Сообщение от alexbmd Посмотреть сообщение
а почему происходит скрытое приведение к указателю ?
Потому что функция не передается по значению (как и массив).

Цитата Сообщение от alexbmd Посмотреть сообщение
и раз уж происходит приведение то почему например не к ссылке ?
Потому что в языке Си нет ссылок

Да, и приведения тут нет. Тут просто одна запись скрытым образом обозначает другую, и только в заданном контексте.

Цитата Сообщение от alexbmd Посмотреть сообщение
пропал один указатель. почему тогда это одно и тоже ?
Это не одно и то же

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void f1(int  a[120]);
void f2(int* p);
 
 
typedef void f_t(int);
 
void f3(f_t f);
void f4(f_t* p);
 
int main()
{
    std::cout << std::boolalpha 
              << std::is_same<decltype(f1), decltype(f2)>::value << '\n'
              << std::is_same<decltype(f3), decltype(f4)>::value << '\n'
              << std::is_same<int[120], int*>::value << '\n'
              << std::is_same<f_t, f_t*>::value << '\n';    
}
https://rextester.com/XXLOO4633
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
19.06.2021, 21:46
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что функция не передается по значению (как и массив).
в си ничего не все передаётся по значению
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
19.06.2021, 22:17
DrOffset,
вот еслиб вы не сказали что аргумент как функция автоматически приводится к указателю (*p) долго бы не понимал почему второй statement true

Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что в языке Си нет ссылок
в Си нет но в Си ++ есть же ? хотя пишут что "под капотом" оно неявно приводиться к разименованому указателю ... если я ничего не путаю.

а какой вызов будет происходить быстрее и/или с меньшими русурсами оперативки
void someFn(Print& (*n)(Print&))
void someFn(Print& (&n)(Print&))
?

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что функция не передается по значению
но если капнуть глубже то сам указатель даже передаётся по назначению :) ?
вот пример
C++
1
2
3
4
void setToNull(int *tempPtr)
{
    tempPtr = nullptr; // по выходу  указатель будет указывать туда же куда и до входа а не NULL
}

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.06.2021, 22:40
Цитата Сообщение от alexbmd Посмотреть сообщение
в Си нет но в Си ++ есть же
Синтаксис и многие правила заимствованы из Си.

Цитата Сообщение от alexbmd Посмотреть сообщение
а какой вызов будет происходить быстрее и/или с меньшими русурсами оперативк
Нет разницы.

Цитата Сообщение от alexbmd Посмотреть сообщение
но если капнуть глубже то сам указатель даже передаётся по назначению ?
Зачем копать, это же на поверхности. Естественно указатель передается по значению.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
20.06.2021, 06:26

Не по теме:

Цитата Сообщение от TRam_ Посмотреть сообщение
Ну да, в С++ запись int a(0);
не знал что с фкнуциями тоже работает
Цитата Сообщение от DrOffset Посмотреть сообщение
Я не думаю, что автор сходу сейчас смог бы
правильно, сходу мозг не хочет ставить имя в центр typedef void f_t(int); void f4(f_t* p); борбсь всеми силами



Цитата Сообщение от DrOffset Посмотреть сообщение
Это не одно и то же
так вы и не говорили что одно и тоже
я понял что TRam_ и TheCalligrapher это имели ввиду в самом начале темы. вот пытался разобраться почему профессионалы понимают что это одно и тоже

Добавлено через 6 минут
а сори, кажеться понял что имелось ввиду
int (*(*f)())[42]; это указатель на функцию (ну или как аргумент для функции принимающей функцию)
int (*f())[42] - а это сама функция на которую ссылается подобный указатель. правильно?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
20.06.2021, 06:55
Цитата Сообщение от TRam_ Посмотреть сообщение
Поэтому если нам нужна инициализация переменной конструктором по-умолчанию, нужно писать
C++
1
int a;
Если это "инициализация переменной конструктором по-умолчанию", то почему тогда результат

C++
1
int a;
отличается от

C++
1
int a = int();
Ведь и там, и там - "конструктор по умолчанию"?

Никакого "конструктора по умолчанию" у типа int нет и никакой "инициализации переменной конструктором по-умолчанию" для типа int быть не может.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
20.06.2021, 11:50
Цитата Сообщение от alexbmd Посмотреть сообщение
я понял что TRam_ и TheCalligrapher это имели ввиду в самом начале темы. вот пытался разобраться почему профессионалы понимают что это одно и тоже
Ничего подобного они не говорили.
Вы что-то не так поняли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2021, 11:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru