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

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

Войти
Регистрация
Восстановить пароль
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

Как работает указатель на функцию? - C++

21.02.2013, 23:29. Просмотров 664. Ответов 12
Метки нет (Все метки)

Вот пример :
C++
1
2
3
4
void error(int i);
void (*p)(int);
p=&error;
(*p)(1);
Что будет происходить при исполнении этой инструкции
C++
1
(*p)(1);
? После разыменования указателя подставится адрес функции, который наверно заменится компилятором на имя функции
C++
1
error
и будет обычный вызов функции вида
C++
1
error(1)
или вызов с адресом если не заменится. А дальше будет
C++
1
int i = 2;
расположенное между телом и сигнатурой функции и начнется вызов первой команды тела функции. То есть любое имя функции - это указатель на первую команду её тела? Можете в подробностях рассказать что происходить от начала вызова функции и до конца?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 23:29     Как работает указатель на функцию?
Посмотрите здесь:

Указатель на функцию (как передать?) - C++
void abc(int a, int b) { } void func(void *f(int, int)) { f; }

Как сделать указатель на функцию ? - C++
Я только учусь программировать и у меня возник такой вопрос. В общем имеется на форме 5 эдитов ввода и один эдит вывода. При наступлении в...

Как получить указатель на функцию - C++
Здравствуйте! Подскажите, как получить указатель на функцию? Амперсанд не помогает. class Menu{ private: //...

Указатель на функцию, как он вводится? СРОЧНО! - C++
На завтра задачу задали, не могу решить. Не поможете? Срочно надо! Сама задача в прикреплениях! Вот мой пример решения, правда...

Как вызвать функцию через указатель? - C++
Добрый день. Всех с наступающим))Здоровье Счастье и бабок))) Подскажите как правильно сделать Тестовый рабочий пример struct AmiVar ...

Как передать указатель на файл в функцию? - C++
Здравствуй по ходу написания программы столкнулся с вопросом как передать указатель на тип файл в функцию. напишите код. ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.02.2013, 23:38     Как работает указатель на функцию? #2
Все функции расположены где-то в памяти. Компилятор в курсе, где именно расположены те функции, которые вы прямо вызываете по имени в программе, поэтому их вызовы сразу заменяются на вызовы по адресу ещё во время компиляции. С помощью указателей на функции вы можете подсунуть нужный адрес не при компиляции, а во время исполнения программы. Принципиальная разница на этом заканчивается.

Не любое имя функции — это указатель на первую команду, а скорее получение указателя на функцию выглядит как имя. Не наоборот. Да и сам указатель — это не обязательно адрес первой команды. Это просто нечто, что позволяет вызвать функцию. Компилятор не обязан делать его адресом первой команды.
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
22.02.2013, 00:53  [ТС]     Как работает указатель на функцию? #3
~OhMyGodSoLong~, тогда какая разница между p=&error; и p=error;? В первом случае берется адрес функции error, то есть там где она расположена в памяти, а во втором случае берется адрес, который содержит error, то есть в ней содержится адрес её тела или чего?
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
22.02.2013, 02:01     Как работает указатель на функцию? #4
Никакой разницы.
C++
1
2
3
4
5
6
    p=&error;
    (*p)(1);
    p(1);
    p=error;
    (*p)(1);
    p(1);
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
22.02.2013, 02:48  [ТС]     Как работает указатель на функцию? #5
palva, это да, но почему?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.02.2013, 02:52     Как работает указатель на функцию? #6
Потому что таков синтаксис взятия указателя на функцию.
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
22.02.2013, 03:21  [ТС]     Как работает указатель на функцию? #7
шикарные ответы
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.02.2013, 03:39     Как работает указатель на функцию? #8
Ну а что ещё вам сказать? На вопросы в стиле "почему 1 + 2 означает сложение чисел 1 и 2".

Ещё раз: указатель на функцию — абстрактное понятие языка Си. Хватит туда приплетать железную реализацию. Если вас интересует именно она, то хватит туда приплетать Си, идите читайте про calling conventions.
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
22.02.2013, 06:46     Как работает указатель на функцию? #9
Цитата Сообщение от mzarb Посмотреть сообщение
тогда какая разница между p=&error; и p=error;?
Тут рулит компилятор, он, понимает, что error это функция и сам присваивает адрес.
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
22.02.2013, 13:17  [ТС]     Как работает указатель на функцию? #10
NIch, ясно, я просто думал, что в этом варианте p=error; error содержит адрес, иначе как бы получилось присвоение указателю, но а если компилятор просто заменяет имя функции на адрес, то это все меняет. Пока писал сообщение, понял что это очевидно, так как знал же и тут раньше говорили что компилятор заменяет имя функций на их адреса, просто в контекст присвоения указателя почему то не осенило.
Всем спасибо, понял свою ошибку.

Добавлено через 7 минут
palva, а в этом коде p(1); , p автоматически разыменовывается компилятором или что-то другое происходит?
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
22.02.2013, 13:58     Как работает указатель на функцию? #11
Да кто его знает, что происходит. В учебниках пишут, что можно так и так. Компиляторы это поддерживают. А логику я в этом месте отключаю и пишу как короче. В языке Delphi с адресами функций такая же ситуация.

По логике вещей функция это константный тип данных. Значение функции это ее определение или реализация. Мы не можем ничего присвоить функции, потому что тогда придется запускать компилятор, чтобы откомпилировать новое значение. Но мы можем присвоить адрес указателю на функцию. То есть надо писать p=&fun и (*p)(). Но это моя логика. Допускаю, что может быть и другая. Посмотрите, как это реализовано в JavaScript. Там всё стройно и логично, хотя все глубИны их подхода я тоже не осознал.
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
22.02.2013, 14:21  [ТС]     Как работает указатель на функцию? #12
palva, да, вот что было в последнем учебнике "Разыменование указателя при вызове не обязательно. Также не обязательно пользоваться & для получения адреса функции.". Есть вещи, которые одними учебниками по c++ не понять, но имхо этот момент можно было и поподробней освещать или ещё раз напоминать что все имена функции при компиляции заменяются адресами, просто чтобы связать эти два момента в памяти.
Кстати спасибо за вашу логику по поводу функции, я тоже задавался этим вопросом, но до поиска ответа не дошло).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2013, 14:26     Как работает указатель на функцию?
Еще ссылки по теме:

Как передать указатель на структуру в функцию - C++
Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже заполненные массивы: void func1() ...

Как в функцию передать указатель на матрицу? - C++
Че то я немного туплю, давно с функциями не работал, мне нужно реализовать функцию которая бы работала и изменяла элементы матрицы...

Как вызвать функцию через указатель? - C++
Привет всем! Помогите пожалуйста! Есть готовая рабочая программа, надо вызвать функцию через указатель. Никак не могу разобраться... =( ...

как сделать правильно указатель на первую функцию - C++
#include "stdafx.h" #include "stdio.h" #include "conio.h" int F(int n) { if(n==0) return 1; if(n==1) return 1; return...


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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.02.2013, 14:26     Как работает указатель на функцию? #13
Цитата Сообщение от mzarb Посмотреть сообщение
что все имена функции
Дело не в имени, а в (), которые стоящие после какого-либо слова говорят, что в этом месте кода ожидается вызов функции. И компилятор уже знает, как работать с символами перед (). Поэтому не важно с * оно, или без.
Yandex
Объявления
22.02.2013, 14:26     Как работает указатель на функцию?
Ответ Создать тему
Опции темы

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