Что такое адрес функции?
Есть функция:
int foo(int **d)
{
return 4;
}
И мы можем вывести:
cout <<foo<<" "<< &foo << endl;
И выводится 2 одинаковых адреса.Объясните,пожалуйста,что это за адреса,почему они одинаковые при разных записях и как их использовать?
Ответы (1 шт):
Почему ваш код выводит одинаковые значения, на самом деле легко объяснить. Стандарт определяет стандартное неявное преобразование из типа функции в тип указатель на функцию:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf
7.3 Function-to-pointer conversion [conv.func] 1 An lvalue of function type T can be converted to a prvalue of type “pointer to T”. The result is a pointer to the function.
Так как вывести в cout саму функцию нельзя, срабатывает это преобразование, и вы выводите в поток тот же указатель на функцию (точнее, результат его приведения к целочисленному типу).
А вот сказать определенно, что такое "адрес функции", уже сложнее. Стандарт определяет, что значением адреса объекта является адрес первого байта его данных, но для адреса функции нет аналогичного утверждения. Соответственно, приходится делать вывод, что адрес функции - это просто некоторое определяемое реализацией значение, которое не обязано совпадать с реальным адресом машинного кода функции в памяти. На практике так и есть, например, в Visual C++ в отладочной конфигурации значение указателя на функцию не совпадает с реальным адресом (который можно получить через специальный API платформы).
Как их использовать? Судя по выводам предыдущего абзаца, никак... Вы можете брать указатель на функцию, хранить его и разыменовать для вызова функции, но само значение указателя для вас - "черный ящик".