2

나는 함수 포인터의 값을 볼 수함수의 포인터에 항상 포인터가 표시되는 이유는 무엇입니까?

#include <iostream> 

using namespace std; 

void foo() { 
    void (*fooptr) (void) = foo; 
    cout << fooptr << endl; 
} 

int main() { 
    void (*fooptr) (void) = foo; 
    foo(); 
    return 0; 
} 

내 의도처럼 뭔가를하려고하고 있어요. main() 함수에있는 함수의 주소를 찾으면 함수가 호출되지 않는다는 것을 이해할 수 있습니다. 함수 호출 스택에 메모리가 할당되지 않았을 수 있습니다. 그러나 함수를 호출하고 포인터의 값을 확인하려고 할 때. 여전히 동일한 결과 인 1을 보여줍니다. 설명이 뭐야? 호출 된 함수 자체의 주소가 인쇄되지 않을 수 있습니다. 우리가 수업에서 가지고있는 것처럼 this과 같은 포인터가 있습니까? 그래서 우리는 그 자체의 주소를 볼 수 있습니까?

+2

가능한 복제본 : http://stackoverflow.com/q/2064692/395718 – Dialecticus

+0

tl; dr :'fooptr'을'void * '로 캐스트하십시오. 작동하지 않는 경우 운이 좋지 않으면 ... – Dialecticus

+3

함수 포인터가 함수 호출에서 사용하는 스택 프레임에 대한 포인터가 아니며 함수 코드에 대한 포인터입니다 – Manu343726

답변

0

표준 스트림 유형은 일반 포인터에 대해서만 기능 포인터에 대해 <<을 오버로드하지 않습니다. 함수 포인터가 암시 적으로 bool으로 변환 될 수 있고 bool에 대한 오버로드가 있으므로이 값이 1로 표시됩니다.

이 주소를 인쇄하려면, 당신은 정기적으로 (객체) 포인터로 변환 할 수 있습니다 :

이 완전히 휴대용 아니라고
cout << reinterpret_cast<void*>(fooptr) << std::endl; 

주 : 구현, 표준에 따르면, 조건부 지원하는 것 정의 된 의미. 그러나 기능을 정규 메모리에 저장하는 주류 플랫폼에서 실현 가능한 구현에 대해 예상되는 주소를 제공해야합니다. 휴대 성을 높이기 위해 intptr_t 또는 uintptr_t으로 변환 할 수 있습니다. 포인터처럼 형식화되기를 원한다면 약간의 추가 작업이 필요합니다.

+0

함수 포인터에서 bool 로의 변환이 정의 된 이유는 무엇입니까? 그 목적은 무엇입니까? – Manu343726

+0

@ Manu343726 : 일반 포인터와 마찬가지로 널 (null)이면'false'로, 그렇지 않으면'true'로 변환합니다. 'if (fooptr) fooptr();'. –

관련 문제