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

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

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

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

14.12.2015, 07:19. Просмотров 337. Ответов 18
Метки нет (Все метки)

Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в которой встречается указатель на функцию, принимающую параметр одного типа и возвращающую указатель на объект другого типа, т.е.
type1 *(*имя) (type2); например, вот такую int *(*name) (char)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2015, 07:19     Указатель на функцию возвращающую указатель
Посмотрите здесь:

Как передать параметр типа "указатель на указатель" в функцию? C++
Указатель на указатель на функцию C++
C++ В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Написать функцию принимающую массив и возвращающую указатель на динамический массив C++
Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) C++
Передать в неуправляемую функцию указатель на указатель C++
Приведение любого двумерного массива к типу указатель на указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
338 / 369 / 42
Регистрация: 20.01.2013
Сообщений: 1,116
14.12.2015, 09:51     Указатель на функцию возвращающую указатель #2
Наверное как то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
typedef int (*GET)(char);
 
int getCodSymbol(char c){
        return (int)c;
}
 
void printCodSymbol(GET p_GET, char c){
    std::cout << p_GET(c) << std::endl;
}
 
int main()
{
   printCodSymbol(getCodSymbol, 'c'); 
    return 0;
}
Добавлено через 28 минут

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
typedef int * (*GET)(char);
 
int * getCodSymbol(char c){
    int var = (int)c;
        return &var;
}
 
void printCodSymbol(GET p_GET, char c){
    std::cout << *p_GET(c) << std::endl;
}
 
int main()
{
   printCodSymbol(getCodSymbol, 'c'); 
    return 0;
}
daslex
1255 / 500 / 102
Регистрация: 02.08.2011
Сообщений: 2,507
14.12.2015, 14:20     Указатель на функцию возвращающую указатель #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
#include <iostream>
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo(const char* ){
   int *pch = new int;
   *pch = 123;
   return pch;  //Возвращаем указатель
}
 
int main()
{
   const char* pch = "HELLO"; //Что-то, что принимает функция
 
 int* (*p)(const char*) = foo; //Инициализируем указатель, указывающий на функцию с одним параметром const char*, возвращающую указатель на int
 //p = foo;   //Если не инициализировать, то простое присваивание
 
  int *ptr = p(pch);  //Нужно для корректной очистки.
  int a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
  std::cout << a << '\n';
  delete ptr; //Чистим память.
 
 system("PAUSE");
}
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 17:43  [ТС]     Указатель на функцию возвращающую указатель #4
egor2116, уточните, пожалуйста, что делает эта программа. Выводится число 99 на экран. Хотелось бы понять почему?

daslex, то есть строка 15 нам не нужна здесь?
rikimaru2013
C++ Game Dev
2350 / 1056 / 232
Регистрация: 30.11.2013
Сообщений: 3,498
14.12.2015, 17:50     Указатель на функцию возвращающую указатель #5
Цитата Сообщение от tst Посмотреть сообщение
уточните, пожалуйста, что делает эта программа
Показывает один из case'ов UB

http://rextester.com/SMJT2427
http://rextester.com/YGWWS44422
http://rextester.com/RIC18438

3 компилятора - 3 разные значения - вы, ТС, скажите почему такое поведение ?
daslex
1255 / 500 / 102
Регистрация: 02.08.2011
Сообщений: 2,507
14.12.2015, 17:55     Указатель на функцию возвращающую указатель #6
Цитата Сообщение от tst Посмотреть сообщение
daslex, то есть строка 15 нам не нужна здесь?
Она нужна если в коде больше чем одна функция и нужна не инициализация указателя адресом функции, а работа с указателем, показывающем на разные функции.

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo(const char* ){
   int *pch = new int;
   *pch = 123;
   return pch;  //Возвращаем указатель
}
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo2(const char* ){
   int *pch = new int;
   *pch = 525;
   return pch;  //Возвращаем указатель
}
 
int main()
{
   const char* pch = "HELLO"; //Что-то, что принимает функция
 
 int* (*p)(const char*); //Инициализируем указатель, указывающий на функцию с одним параметром const char*, возвращающую указатель на int
  p = foo;   //Если не инициализировать, то простое присваивание
 
  int *ptr = p(pch);  //Нужно для корректной очистки.
  int a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
  std::cout << a << '\n';
  delete ptr; //Чистим память.
 
  /////////////////////////
  p = foo2; //Сейчас указатель есть, но функции еще не вызывалось
  p(pch);  //Вызов функции foo2 использованием указателя p и параметра pch
  a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
  std::cout << a << '\n';
  delete ptr; //Чистим память.
 
 
 system("PAUSE");
}
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 18:03  [ТС]     Указатель на функцию возвращающую указатель #7
rikimaru2013, что такое ub? По всей видимости, 99 - это значение для Visual Studio

daslex, большое спасибо, очень понятно объясняете
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 18:11  [ТС]     Указатель на функцию возвращающую указатель #8
При запуске последнего кода появилось сообщение
Миниатюры
Указатель на функцию возвращающую указатель  
daslex
14.12.2015, 18:25
  #9

Не по теме:

Попробуйте заново. Есть вероятность, что я выложил некорректный вариант и быстро его исправил, а вы его (некорректный) подхватить успели.

tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 18:37  [ТС]     Указатель на функцию возвращающую указатель #10
daslex, перепроверила, все-таки это окошко остается
Kastaneda
Форумчанин
Эксперт С++
4259 / 2791 / 219
Регистрация: 12.12.2009
Сообщений: 7,119
Записей в блоге: 1
Завершенные тесты: 1
14.12.2015, 18:45     Указатель на функцию возвращающую указатель #11
tst, daslex, второй delete ptr; вызывает это окошко.
daslex
1255 / 500 / 102
Регистрация: 02.08.2011
Сообщений: 2,507
14.12.2015, 18:51     Указатель на функцию возвращающую указатель #12
Kastaneda, не должен. Когда вызывается функция (а она у меня однозначно вызывается) создается новый указатель, который я возвращаю. Его я удаляю. 2 вызова функции - 2 new, 2 delete.
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 19:04  [ТС]     Указатель на функцию возвращающую указатель #13
daslex, А верно, если удаляю строку со вторым delete - то и окошко пропадает
Kastaneda
Форумчанин
Эксперт С++
4259 / 2791 / 219
Регистрация: 12.12.2009
Сообщений: 7,119
Записей в блоге: 1
Завершенные тесты: 1
14.12.2015, 19:07     Указатель на функцию возвращающую указатель #14
Цитата Сообщение от daslex Посмотреть сообщение
Когда вызывается функция (а она у меня однозначно вызывается) создается новый указатель, который я возвращаю. Его я удаляю. 2 вызова функции - 2 new, 2 delete.
Еще раз на свой код посмотри

Добавлено через 2 минуты
tst, смысл не в том, чтобы удалить второй delete ptr;, а в том, чтобы заставить его правильно работать
daslex
1255 / 500 / 102
Регистрация: 02.08.2011
Сообщений: 2,507
14.12.2015, 19:14     Указатель на функцию возвращающую указатель #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нашел ошибку свою.
Вот.
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
#include <iostream>
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo(const char*) {
    int *pch = new int;
    *pch = 123;
    return pch;  //Возвращаем указатель
}
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo2(const char*) {
    int *pch = new int;
    *pch = 525;
    return pch;  //Возвращаем указатель
}
 
int main()
{
    
        const char* pch = "HELLO"; //Что-то, что принимает функция
 
        int* (*p)(const char*); //Инициализируем указатель, указывающий на функцию с одним параметром const char*, возвращающую указатель на int
        p = foo;   //Если не инициализировать, то простое присваивание
 
        int *ptr = p(pch);  //Нужно для корректной очистки.
        int a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
        std::cout << a << '\n';
        delete ptr; //Чистим память.
 
                    /////////////////////////
        p = foo2; //Сейчас указатель есть, но функции еще не вызывалось
        ptr = p(pch);  //Вызов функции foo2 использованием указателя p и параметра pch
        a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
        std::cout << a << '\n';
        delete ptr; //Чистим память.
    
 
    system("PAUSE");
}
Добавлено через 5 минут

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
а в том, чтобы заставить его правильно работать
он - то правильно работает. Что сказали - то и сделает.

tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 21:59  [ТС]     Указатель на функцию возвращающую указатель #16
Возник еще такой вопрос - есть функция int *foo(const char* ), в качестве аргумента которой const char*. Подскажите, пожалуйста, в чем смысл этого аргумента
daslex
1255 / 500 / 102
Регистрация: 02.08.2011
Сообщений: 2,507
14.12.2015, 23:12     Указатель на функцию возвращающую указатель #17
В моем коде вообще ни в чем.
Цитата Сообщение от tst Посмотреть сообщение
указатель на функцию, принимающую параметр одного типа и возвращающую указатель на объект другого типа
надо было параметр. получили параметр.
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 211
14.12.2015, 23:18  [ТС]     Указатель на функцию возвращающую указатель #18
А если в общем - он является константным указателем? - просто впервые сталкиваюсь с таким, обычно звездочка стояла перед именем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2015, 00:29     Указатель на функцию возвращающую указатель
Еще ссылки по теме:

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
Расскажите, как здесь работает указатель на указатель? C++
Почему указатель на указатель объявляется как float **A; C++
Объяснить работу функции, возвращающей указатель на указатель на char C++
C++ Указатель на указатель, функции для создания новых массивов?

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

Или воспользуйтесь поиском по форуму:
daslex
1255 / 500 / 102
Регистрация: 02.08.2011
Сообщений: 2,507
15.12.2015, 00:29     Указатель на функцию возвращающую указатель #19
C++
1
int *foo2(char* const) ;
Я просто использую пустое имя, чтобы оно глаза не мозолило за ненужностью. Чтобы к нему можно было обращаться, это имя стоит дописать в самый конец параметра
C++
1
int *foo2(const char* const NAME)
Yandex
Объявления
15.12.2015, 00:29     Указатель на функцию возвращающую указатель
Ответ Создать тему
Опции темы

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