2017-04-11 1 views
0

아래 코드에서 file.recmain으로 읽고 char buf에 넣고 있습니다. 그렇다면이 bufgetCallBack() 함수의 함수 포인터를 전달하지만 두 가지 방법으로 함수를 전달합니다. 이 함수는이 두 가지 방법으로 함수 포인터를 정상적으로받습니다. 그래서 나는 그것을 사용하거나 사용하는 차이점을 아는 데 관심이 있습니다.함수 포인터에서 "&"연산자를 사용할 때?

#include<stdio.h> 

void getCallBack(char buf[], void(*executeCallBack)(char[])){ 
    printf("callback recived\n"); 
    executeCallBack(buf); 
} 

void callBack(char buf[]){ 
    printf("executing callback...\n"); 
    printf("buf content: "); 
    printf("%s\n", buf); 
} 

void main() { 

    FILE *ReadingXmlFile = fopen("texto.rec", "r"); 
    char buf[10000]; 
    fread(buf, 1, 10000, ReadingXmlFile); 
    fclose(ReadingXmlFile); 

    printf("passing \"&callBack\"\n"); 
    getCallBack(buf, &callBack); 

    printf("passing \"callBack\"\n"); 
    getCallBack(buf, callBack); 
    // 
} 
+1

함수는 자연스럽게 자체에 대한 포인터로 쇠퇴합니다. 배열이 첫 번째 요소에 대한 포인터로 쇠약하는 것과 유사합니다. 내가 그것에 대해 명시 적으로 권장하고 항상 연산자의 주소를 사용하는 '&'. –

답변

3

차이는 없습니다. &이 암시됩니다.

배열이 someArray 인 경우 &someArray[0] 대신 someArray을 사용할 수있는 것과 비슷합니다.

4

순전히 외관상의 문제입니다. 함수 유형이 포인터 유형으로 (거의 모든 곳에서) 포인터 유형으로 붕괴하는 상황에서 명시적인 단항 &은 아무런 의미가 없습니다. 더 잘 보이는 것을 선택하십시오. 일관성있게하기 위해 노력하십시오.


거의 똑같은 포인터를 통한 함수 호출시 명시 * 연산자를 사용하여 적용된다. 콜백은 executeCallBack(buf) 또는 (*executeCallBack)(buf)으로 호출 할 수 있습니다. 둘은 동일합니다. 다시 말하지만, 당신의 스타일을 선택하고 그것에 충실하십시오.

대칭성을 위해서 주소를 가져올 때 &을 사용하는 경우 함수를 호출 할 때 *을 사용해야합니다.

+0

그래서'sizeof callBack'은 좋지 않고'sizeof & callBack'은 _other_ 컨텍스트에 좋습니다. – chux

+0

@chux : 나는 그 질문을 이해하고 있는지 확신 할 수 없다. 앞에서 설명한'&'에 대한 설명은 피연산자가 함수 유형 인 컨텍스트에만 적용됩니다. 'callBack' 자체가 (함수가 아닌) 포인터라면, 그것은 다른 이야기입니다.'&'는 그러한 경우에 큰 차이를 만듭니다. – AnT

관련 문제