2012-04-19 5 views
0

가능한 중복 :
Why do all these crazy function pointer definitions all work? What is really going on?전달 함수 포인터 - 의미

내가 왜 코드 동등성 모두 보유

void f(int& i) 
{ 
    i++; 
} 

void g(void (passed_f)(int&),int& a) //`passed_f` equivalent to `*passed_f` 
{ 
    passed_f(a); 
} 

int main() 
{ 
    int n=0; 
    g(f,n);        //`f` is equivalent to `&f` 
} 

에 대한 설명은 감사하겠습니다, 오류가 발생하지 않으며 정확히 동일한 결과를 제공한다는 의미에서 1입니다. g에서 함수 나 함수 자체에 대한 포인터를 받아들이는 것은 중요하지 않습니다. 나는 또한 [c] 태그가 적절하다고 생각합니다.

+2

참고 문헌이 C, afaik에 존재하지 않습니다. – BlackBear

+0

이것은 함수 포인터와 관련하여 C에서 문법적 인 표현입니다. 'f'와'& f'는 모두 같습니다. – chrisaycock

+0

답변을위한 Thx; 표준 어딘가에 공식화되어 있습니까? –

답변

2

기능 포인터는 C에서 특별하다 :

  • 함수의 이름, &f는 함수 포인터 동안 f가하는 기능 지정자라고; 간접적 인 함수 포인터는 함수 지정자로 평가된다; 간접적으로 함수 지정자는 함수 지정자 자체를 평가합니다.
  • 그것은 거의 모든 목적을 위해 포인터를 것으로 함수 이름을 생각하는 경우 등 f(), (*f)(), (**f)(),

로 함수 포인터를 f를 호출 할 수 있습니다 다음,이 몇 가지 의미가 있습니다. Hello World의이 버전을 컴파일 해보십시오 :

int main() 
{ 
    // try replacing * with & or adding more *s 
    (*printf)("Hello, world!\n"); 
    return 0; 
} 

C 표준에서이 내용은 6.3.2.1 단락에서 다루고 있습니다. C++ 표준에 대해서는 잘 모르겠습니다.

+0

정확하게. 고맙습니다! –

2

passed_f은 실제로 *passed_f과 같습니다. 컴파일러는 둘 다에서 동일한 출력을 생성합니다. 그 차이는 단지 관용적이다. 어떤 사람들은 함수에 대한 포인터를 가지고 있다는 것을보다 명확하게 표현하기 때문에 후자의 형식을 선호합니다.이 표기법은 다른 형식에 사용되는 포인터 표기법과 더 일치합니다.